我正在使用eventmachine从HornetQ主题中读取,推送到由EM websocket连接订阅的频道。我需要防止@topic.receive循环阻塞,所以我创建了一个进程,并且在没有回调的情况下调用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发布于 2014-12-29 02:57:47
这没问题,但是EM.defer会产生20个线程,所以我会在您的用例中避免使用它。一般来说,我会完全避免使用EM,尤其是Java反应器,因为我们从未完成它。
Torquebox具有原生的websockets解决方案,在这种情况下这将是一种更好的方式,并为您解决了许多其他封装挑战。
如果你真的想坚持使用EM,那么我会使用Thread.new而不是defer,这样可以避免19个空闲线程无缘无故地占用额外的内存。
https://stackoverflow.com/questions/13161920
复制相似问题