4

私は eventmachine を使用して HornetQ トピックから読み取り、EM Websocket 接続によってサブスクライブされているチャネルにプッシュします。@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
4

1 に答える 1