1

http クライアント/サーバーを置き換える単純な zmq システムを作成しようとしています。サーバーがオフまたは使用できない場合、クライアントはタイムアウトしますが、再試行または停止しません。私は何が欠けていますか?

zmq_client.rb (zeromq ガイドの Han 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 ガイドにある Oleg Sidorov のコードの修正版)

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
4

1 に答える 1

1

2番目は1番目の直後に発生するため、最初のタイムアウト後に再Send: #{message} failed試行するとすぐにエラーが発生するはずです。REQソケットは、それぞれが(タイムアウトではなく成功)後に実行する必要があることを強制します。sendsendsendsendrecv

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

ガイドの「Rubyのレイジーパイレーツクライアント」の例が役立つ場合があります。

于 2012-05-03T11:00:45.887 に答える