无限听jabber事件?

时间:2014-03-17 20:24:58

标签: ruby-on-rails ruby

我正在使用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. 最糟糕的事情 - 我的服务器没有响应其他响应,尽管我使用的是Puma多线程服务器。

  5. 实现这样的功能的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我得到了解决方案

  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