2012-02-10 78 views
0

我试图用EM-zeromq宝石来实现的请求 - 响应模式,但我不能得到响应插座在消息发送回请求的插座处理程序。我已经写了一些非常简单的代码来测试它:请求 - 响应模式不能与EM-zeromq工作

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收到消息”,但答复从未到达请求代码。我怀疑它与在响应代码的处理程序中写入套接字有关,因为当我使用请求路由器模式时会发生同样的事情。它唯一的工作时间是当我从服务器发送消息而不先从客户端发送消息(使用推挽)。

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

我使用的红宝石1.9.2p290 EM-zeromq 0.2.2。

回答

0

我commmited在主分支,它应该解决您的问题的修复程序,你可以试试看?

您可以使用捆绑轻松地测试它:
在您的应用程序文件夹中创建一个名为的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的新维护者。