0

我是这方面的新手,我编写了一个简单的代码,从 RabbitMQ 获取数据并将其发送到通过 websockets 连接的客户端。

这里的问题是:

  • 如果我启动一个应用程序并且客户端连接(在浏览器中)它会发送数据并且一切正常。但是,如果我关闭浏览器窗口并再次打开,它就会停止工作。
  • 当两个客户端通过浏览器连接到它时也是如此。我希望这段代码一次为多个客户提供服务。

$channel = EM::Channel.new

EM.run do
    class App < Sinatra::Base

        get '/' do
            haml :index
        end

    end

    EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws|
        ws.onopen {
            AMQP.start(:host => "localhost") do |connection|
                $channel = AMQP::Channel.new(connection)
                exchange = $channel.fanout("slant", :auto_delete => false, :durable => true)
                queue        = $channel.queue("my-events", :auto_delete => true, :durable => false)

                queue.bind(exchange, :routing_key => "").subscribe(:ack => true) do |headers, payload|
                    ws.send payload.to_s
                    puts payload
                    $channel.acknowledge(headers.delivery_tag, false)
                end
            end
        }
        ws.onclose { puts "Client disconnected" }
    end
    App.run!({:port => 3000})
end

客户的 JS 如下:

$(function(){
  ws = new WebSocket("ws://localhost:8080");

  ws.onmessage = function(evt) {
    var msg = json_parse(evt.data);

    row = '<tr><td>' + msg.severity + '</td>' + '<td>' + msg.service + '</td>' + '<td>' + msg.description+ '</td>' + '<td>' + msg.server + '</td>'+ '<td>' + msg.source + '</td>' + '<td>' + msg.date + '</td>'  + '<td>' + msg.host_address + '</td>' + '<td>' + msg.additional_info + '</td>' + '<td>' + msg.event_type + '</td>' + '</tr>'
    if ($('#alerts tbody tr:first').length > 0){
      $('#alerts tbody tr:first').before(row);
    } else {
      $('#alerts tbody')append(row);
    }
  };

  ws.onclose = function() {
    ws.send("Leaves the chat");
  };

  ws.onopen = function() {
    ws.send("Join the chat");
  };

});

我不确定出了什么问题?看起来我的代码中有一些根本性的错误。

4

1 回答 1

0

尝试在不同的线程中运行 EventMachine 和 Sinatra 应用程序

于 2013-11-13T10:07:42.137 回答