我是这方面的新手,我编写了一个简单的代码,从 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");
};
});
我不确定出了什么问题?看起来我的代码中有一些根本性的错误。