加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读