使用xmpp4r连接gmail的时候,时间长了就会断,因为我只加了一个message callback,所以如果长时间空闲,则没有任何消息发过去。可能就是因为这个服务器才会断开的。
所以要定时发一个在线信息过去,这样肯定不会自动断线了。
在主函数start里:
def self.start
init_all()
t=Time.now
while true
#per 2 mins
sleep(1)
if Time.now - t > 120
set_online_xmpp_with_retry_login(@@xmpp_conn)
set_online_msn_with_retry_login(@@msnm)
t=Time.now
end
end
end
定时2分钟去发一个在线信息,这样服务器始终认为在线,就可以正常收到消息了。
发送在线信息:
def self.set_online_xmpp_with_retry_login(j)
begin
p=Jabber::Presence.new(:chat)
j.send(p)
Robot.debug_log("set online for xmpp")
rescue => detail
Robot.exception_log("set online error:",detail)
begin
connect_xmpp()
Robot.debug_log("reconnected for xmpp")
rescue => detail
Robot.exception_log("reconnect failed, please restart. error:",detail)
end
end
end
如果发送遇到异常,就尝试重新连接。
处理消息也加强了一些异常处理:
j.add_message_callback do |m|
begin
if m!=nil && m.body!=nil && !m.body.empty?
email=Robot.split_email(m.from)
msg_text=Robot.process_command(m.body,email)
return_msg=Jabber::Message::new(m.from,msg_text)
return_msg.type=m.type
@@xmpp_conn.send(return_msg)
end
rescue => detail
Robot.exception_log("process_command error:",detail)
end
end
传递的参数m有可能为nil,所以一定要检查一下。
全部源码在:http://code.google.com/p/whereisitcn/
功能很简单,是一个存储东西摆放位置的机器人。