ruby – EventMachine和em-websocket – 从队列中读取并推送到频
发布时间:2020-12-17 02:03:11 所属栏目:百科 来源:网络整理
导读:我正在使用eventmachine从HornetQ主题中读取,推送到由EM websocket连接订阅的Channel.我需要阻止@ topic.receive循环阻塞,所以创建了一个proc并且调用EventMachine.defer而没有回调.这将无限期地运行.这很好用.我也可以使用Thread.new. 我的问题是,这是从流/
我正在使用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 解决方法
这没关系,但是EM.defer会产生20个线程,所以我会为你的用例避免它.一般来说,我会完全避免EM,特别是Java反应堆,因为我们从未完成它.
Torquebox有一个原生的stockets over websockets解决方案,这将是一个更好的方式在这个上下文,并解决了一堆其他封装挑战. 如果你真的想坚持使用EM,那么我会使用Thread.new而不是延迟,以避免19个空闲线程无缘无故地占用额外的RAM. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |