请求 - 响应模式不适用于em-zeromq

时间:2012-02-10 21:10:44

标签: ruby eventmachine zeromq

我正在尝试使用em-zeromq gem实现请求 - 响应模式,但我无法获得响应套接字以将消息发送回其处理程序中的请求套接字。我写了一些非常简单的代码来测试它:

em_req.rb

require 'em-zeromq'

client_id = ARGV[0] ? ARGV[0].to_i : 1
message = ARGV[1] || "Foo"

Thread.abort_on_exception = true

class ReqHandler
  attr_reader :received

  def on_readable(socket, messages)
    messages.each do |m|
      puts "Received message from server: #{m.copy_out_string}"
    end
  end
end

trap('INT') do
  EM.stop
end

ctx = EM::ZeroMQ::Context.new(1)

EM.run do
  conn = ctx.connect(ZMQ::REQ, 'tcp://127.0.0.1:9000', ReqHandler.new, identity: "client#{client_id}")
  conn.socket.send_string(message)
end

em_rep.rb

require 'em-zeromq'

Thread.abort_on_exception = true

class ResponseHandler
  attr_reader :received

  def on_readable(socket, messages)
    message = messages.first.copy_out_string
    puts "Received message from client: #{message}"

    socket.send_msg("re: #{message}")
  end
end

trap('INT') do
  EM.stop
end

ctx = EM::ZeroMQ::Context.new(1)

EM.run do
  socket = ctx.bind(ZMQ::REP, 'tcp://127.0.0.1:9000', ResponseHandler.new)
end

我使用推拉式模式编写了相似的代码并使其工作,但是对于请求 - 响应,我得到的是响应代码打印“来自client1:Foo的已接收消息”但是回复永远不会到达请求代码。我怀疑它与在响应代码的处理程序中写入套接字有关,因为当我使用请求路由器模式时会发生同样的事情。它唯一有效的时间是我从服务器发送消息而不首先从客户端发送消息(使用推拉)。

关于可能导致此问题的任何想法?宝石的作者不再维护它,但我想我会发布这个问题,希望其他有类似经历的开发者能够看到这个。

我在Ruby 1.9.2p290上使用em-zeromq 0.2.2。

1 个答案:

答案 0 :(得分:0)

我在主分支中提交了一个可以解决您问题的修复程序,您可以尝试一下吗?

您可以使用捆绑器轻松测试它:
在应用程序文件夹中创建一个名为Gemfile的文件:

source :rubygems
gem 'em-zeromq', :git => "git://github.com/andrewvc/em-zeromq.git"

并在ruby文件之上添加:

require 'rubygems'
require 'bundler/setup'

最后在应用程序文件夹中运行它($是你的提示符):

$ bundle

现在您可以执行ruby文件,他们将使用github的最新代码

编辑:我是em-zeromq gem的新维护者。