无限听jabber事件?

我正在使用Jabber在Ruby on Rails上编写一个聊天应用程序。 发送消息非常容易实现,但是在循环中接收消息是一个相当大的挑战。

我希望在没有浏览器刷新的情况下从服务器获取回调。 我尝试使用ActionController :: Live。

在我的客户端,我的代码是:

var source = new EventSource('/chat/events'); source.addEventListener('refresh', function(event) { AddMessage(event.data); }); 

我的控制器代码是:

 def chat_events # SSE expects the `text/event-stream` content type response.headers['Content-Type'] = 'text/event-stream' sse = Reloader::SSE.new(response.stream) puts "Starting XMMP call" begin @xmmpClient = XmppClient.new @xmmpClient.loginUsingNameAndPassword(****, ***) @xmmpClient.listen_connections sse rescue IOError puts "Error" # When the client disconnects, we'll get an IOError on write ensure puts "closing stream" sse.close end end 

而且,我的XMMP客户端是:

 def listen_connections(writer = nil) if not @logged_in puts "Not logged" raise "Not logged" end @robot.send(Jabber::Presence.new.set_show(nil)) loop do puts "Listening callback" @robot.add_message_callback do |message| puts "Got message " + message.inspect if not writer.nil? writer.write({ :message => message.body }, :event => 'refresh') end end sleep 2 end end 

我得到了什么:

  1. 每隔一秒左右调用控制器的chat_events方法。
  2. 因此,一次执行几个回调。
  3. 当我收到消息时,我得到了四到五次。

     {"message":"fffdsfd"} {"message":"fffdsfd"} {"message":"fffdsfd"} {"message":"fffdsfd"} 
  4. 最糟糕的事情 – 我的服务器没有响应其他响应,虽然我使用的是Pumamultithreading服务器。

实现这样的function的正确方法是什么?

我得到了解决方案

  puts "." client.add_message_callback do |message| if message.type != :error arr = message.from.to_s.split('@') puts arr[0] puts message.body end end while 1 end