2012-05-03 159 views
1

我正在嘗試編寫一個簡單的zmq系統來替換http客戶端/服務器。當服務器關閉/不可用時,我的客戶端超時,但不重試或停止。我錯過了什麼?ruby​​ - zeromq檢測到客戶端超時,但客戶端掛起

zmq_client.rb(從zeromq指南韓霍爾的懶盜版客戶端的修改版本)

require 'rubygems' 
require 'zmq' 

context = ZMQ::Context.new 
socket = context.socket(ZMQ::REQ) 
socket.connect('tcp://localhost:5559') 

retries = 2 
timeout = 10 

retries.times do |tries| 
    message = "Hello #{tries}" 
    raise("Send: #{message} failed") unless socket.send(message) 
    puts "Sending string [#{message}]" 

    if ZMQ.select([socket], nil, nil, timeout) 
    message = socket.recv 
    puts "Received reply [#{message}]" 
    break 
    else 
    puts "timeout" 
    end 

end 
socket.close 

zmq_broker.rb(奧列格·西多羅夫的代碼修改後的版本上zeromq指南中找到)

require 'rubygems' 
require 'ffi-rzmq' 

context = ZMQ::Context.new 
frontend = context.socket(ZMQ::ROUTER) 
frontend.bind('tcp://*:5559') 
poller = ZMQ::Poller.new 
poller.register(frontend, ZMQ::POLLIN) 

loop do 
    poller.poll(:blocking) 
    poller.readables.each do |socket| 
    if socket === frontend 
     loop do 
     socket.recv_string(message = '') 
     more = socket.more_parts? 
     puts "#{message}#{more}" 
     socket.send_string(message, more ? ZMQ::SNDMORE : 0) 
     break unless more 
     end 
    end 
    end 
end 

回答

1

你在第一次超時後再次嘗試send時應該會收到錯誤Send: #{message} failed,因爲您的第二個send將直接發生在第一個send之後,並且REQ套接字強制每個send必須去(成功,不超時)recv

在懶惰的盜版模式中,您可能需要在獲得答覆之前發送多個請求。在the 0MQ Guide中建議的解決方案是在錯誤發生後關閉並重新打開REQ套接字。您的客戶端不關閉/重新打開REQ套接字。

您可能會在本指南中找到有用的the "Lazy Pirate client in Ruby" example