ruby - zeromq检测到客户端超时,但客户端挂起

时间:2012-05-03 07:33:23

标签: ruby zeromq mq

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

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

1 个答案:

答案 0 :(得分:1)

在第一次超时后再次尝试Send: #{message} failed时,您应该会收到错误send,因为您的第二次send将在第一次send之后直接发生,并且REQ套接字强制执行每个send必须遵循(成功,而不是超时)recv

在懒惰的盗版模式中,您可能需要在收到回复之前发送多个请求。 the 0MQ Guide中建议的解决方案是在发生错误后关闭并重新打开REQ套接字。您的客户端不会关闭/重新打开REQ套接字。

您可以从指南中找到有用的the "Lazy Pirate client in Ruby" example