1

我正在尝试编写一个简单的 zmq 系统来替换 http 客户端/服务器。当服务器关闭/不可用时,我的客户端超时,但不会重试或停止。我错过了什么?

zmq_client.rb(修改版 Han Holl 的懒惰海盗客户端 from zeromq guide)

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

在第一次超时后再次Send: #{message} failed尝试时,您应该会立即收到错误,因为您的 2nd将在 1st 之后直接发生,并且 REQ 套接字强制每个必须遵循 (successful, not timeout-ed) 。sendsendsendsendrecv

在惰性海盗模式中,您可能需要发送多个请求才能获得回复。0MQ 指南中建议的解决方案是在出错后关闭并重新打开 REQ 套接字。您的客户端不会关闭/重新打开 REQ 套接字。

您可能会发现指南中的“Ruby 中的 Lazy Pirate 客户端”示例很有帮助。

于 2012-05-03T11:00:45.887 回答