EventMachine和em-websocket - 从队列中读取并推送到频道

时间:2012-10-31 15:55:10

标签: ruby websocket jruby eventmachine em-websocket

我正在使用eventmachine从HornetQ主题中读取,推送到EM websocket连接订阅的Channel。我需要阻止@ topic.receive循环阻塞,所以创建了一个proc并且调用EventMachine.defer而没有回调。这将无限期地运行。这很好用。我也可以使用Thread.new。

我的问题是,这是从流/队列中读取数据并将数据传递到通道的正确方法吗?还有更好/任何其他方法吗?

require 'em-websocket'
require 'torquebox-messaging'

class WebsocketServer

  def initialize
    @channel = EM::Channel.new

    @topic = TorqueBox::Messaging::Topic.new('/topics/mytopic')
  end 

  def start
    EventMachine.run do

      topic_to_channel = proc do
        while true
          msg = @topic.receive
          @channel.push msg
        end
      end

      EventMachine.defer(topic_to_channel)

      EventMachine::WebSocket.start(:host => "127.0.0.1", :port => 8081, :debug => false) do |connection|
        connection.onopen do

          sid = @channel.subscribe { |msg| connection.send msg }

          connection.onclose do            
            @channel.unsubscribe(sid)
          end
        end
      end                  
    end
  end
end

WebsocketServer.new.start

1 个答案:

答案 0 :(得分:1)

这没关系,但EM.defer会产生20个线程,所以我会为你的用例避免使用它。一般来说,我会完全避免EM,尤其是Java反应堆,因为我们从未完成它。

Torquebox有一个本地化的websockets解决方案,这将是一个更好的方式在这种情况下,并解决了一堆其他的封装挑战。

如果你真的想坚持使用EM,那么我使用Thread.new而不是延迟,以避免19个空闲线程无缘无故地占用额外的ram。