Шаблон запрос-ответ не работает с 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

Я написал аналогичный код с использованием шаблона push-pull и заставил его работать, но для запроса-ответа все, что я получаю, это код ответа, печатающий «Полученное сообщение от client1: Foo», но ответ никогда не достигает кода запроса. Я подозреваю, что это связано с записью в сокет в обработчике кода ответа, потому что то же самое происходит, когда я использую шаблон маршрутизатора запроса. Единственный раз, когда это работает, - это когда я отправляю сообщение с сервера, не отправляя сначала сообщение от клиента (используя push-pull).

Есть идеи о том, что может быть причиной этого? Автор гема больше не поддерживает его, но я подумал, что все равно опубликую эту проблему в надежде, что другие разработчики с аналогичным опытом увидят это.

Я использую em-zeromq 0.2.2 на Ruby 1.9.2p290.


person jgyllen    schedule 10.02.2012    source источник


Ответы (1)


Я внес исправление в главную ветку, которое должно решить вашу проблему, можете ли вы попробовать?

Вы можете использовать упаковщик, чтобы легко проверить это:
Создайте файл с именем Gemfile в папке вашего приложения:

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

И добавьте это поверх ваших файлов ruby:

require 'rubygems'
require 'bundler/setup'

И в последний раз запустите это в папке приложения ($ - ваше приглашение):

$ bundle

Теперь вы можете запускать свои рубиновые файлы, они будут использовать последний код с github.

Изменить: я новый сопровождающий гем em-zeromq.

person Schmurfy    schedule 21.02.2012