我正在实现一个google talk监听器,它可以更新我所有联系人列表项的状态。

require 'xmpp4r'
require 'xmpp4r/roster'
require 'xmpp4r/roster/helper/roster'

sender_jid = Jabber::JID.new('email')
client = Jabber::Client.new(sender_jid)
client.connect('talk.google.com')
client.auth('password')

client.send(Jabber::Presence.new.set_type(':available'))

#Presence updates:
client.add_presence_callback do |pres|
  puts pres.from.to_s.split("/")[0] unless pres.nil?
  puts pres.show.to_s.inspect unless pres.nil?
end

Thread.stop
client.close

代码运行良好,线程继续监听一个gmail帐户,但在出现几个联系人后,出现此错误:
client.rb:33:in `stop': deadlock detected (fatal)
    from client.rb:33:in `<main>'

出现此错误的另一个帐户有更多不同状态的联系人。好像不明白为什么会这样。任何帮助都将是惊人的。
谢谢。

最佳答案

通过记录器解决了这个问题。由于分析错误,它引发了死锁。有些联系人的字符无法解析。
似乎xmpp4r已经有一段时间没有更新了,我的解决方案是转移到一些人已经更新的回购协议上。
如果有人有类似的问题,请查看:
https://github.com/whitehat101/xmpp4r
解析是通过nokogiri完成的。
更新:
有很多新的维护人员已经完成了上面的许多更新,并解决了其他问题:
https://github.com/xmpp4r/xmpp4r

08-06 07:42