我有一个rails应用程序,每个用户都可以连接他的Facebook帐户,并允许从正在使用的应用程序发送消息。因此,每个拥有连接的Facebook帐户的已登录用户必须拥有一个使用其Facebook-id,令牌等授权的Jabber客户端,我正在使用xmpp4r GEM。
连接的facebook帐户有令牌,而facebook数据作为Mailman对象存储在数据库中.Mailman类还有控制Jabber客户端的方法,如run_client,connect_client,authorize_client,stop_client,get_client等。对我来说最重要的方法是connect_client和get_client。
class Mailman < ActiveRecord::Base
@@clients = {} unless defined? @@clients
def connect_client
#some code
@@clients[self.id] = Jabber::Client.new Jabber::JID.new(facebook_chat_id)
#some code
end
def get_client
@@clients[self.id]
end
#other stuff
end
正如您在代码中看到的那样,每个Mailman对象都有get_client方法,该方法应该返回Jabber :: Client对象,它是真的,它正在工作,但只在运行应用程序的范围内,因为@ @clients变量仅存储在特定的运行应用程序中。
这对我来说是个问题,因为我想使用cron任务关闭空闲客户端,而cron任务正在使用app的不同初始化,因此Mailman.find(x).get_client将始终返回nil,即使它返回生产应用程序中的Jabber :: Client对象。
你是如何处理这些问题的?例如,是否可以获取指向Jabber :: Client对象的内存的指针并将其保存到数据库,因此任何其他应用程序的初始化都可以使用它?我不知道怎么做到这一点。谢谢你的任何建议!
答案 0 :(得分:1)
即使您设法在数据库中存储“指向内存的指针”,它对cron作业也没用。 cron作业作为一个新进程启动,操作系统确保它不能访问任何其他进程的内存空间。
最好的方法是创建一个控制器来管理正在运行的XMPP客户端。这将为您的cron作业提供一个安静的API,允许您使用HTTP请求终止空闲客户端。