2012-05-03 7 views
1

httpクライアント/サーバを置き換える簡単なzmqシステムを作成しようとしています。私のクライアントは、サーバーの電源が切れていても使用できなくなってもタイムアウトしますが、再試行または停止しません。私は何が欠けていますか?ruby​​ - zeromqがクライアントタイムアウトを検出しましたが、クライアントがハングアップする

zmq_client.rb(zeromqガイドから漢HOLLの怠惰な海賊クライアントの修正版)

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の直後に2番目のsendが発生し、REQソケットがそれぞれsendは、成功する必要があります(成功、タイムアウトなし)recv

怠惰な海賊のパターンでは、返信を受ける前にいくつかのリクエストを送信する必要があるかもしれません。 the 0MQ Guideで提案されている解決策は、エラーの後にREQソケットを閉じて再度開くことです。あなたのクライアントは、REQソケットを閉じたり、再オープンしたりしません。

ガイドから便利なthe "Lazy Pirate client in Ruby" exampleが見つかるかもしれません。

関連する問題