Я пытаюсь реализовать шаблон запрос-ответ, используя гем 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
Я написал аналогичный код, используя push-вытащить шаблон и заставить его работать, но для запроса-ответа все, что я получаю, это печать кода ответа «Полученное сообщение от client1: Foo», но ответ так и не достигает кода запроса.Я подозреваю, что это связано с записью в сокет в обработчике кода ответа, потому что то же самое происходит, когда я использую шаблон запроса-маршрутизатора.Единственное время, когда это работает, - это когда я отправляю сообщение с сервера, не отправляя сначала сообщение от клиента (используя push-pull).
Есть идеи о том, что может быть причиной этого?Автор драгоценного камня больше не поддерживает его, но я думал, что я все равно опубликую эту проблему в надежде, что другие разработчики с подобным опытом увидят это.
Я использую em-zeromq 0.2.2 на Ruby1.9.2p290.