2

我有一个 Rails 应用程序,每个用户都可以连接他的 Facebook 帐户,并允许从正在使用的应用程序发送消息。因此,每个连接 Facebook 帐户的登录用户都必须有一个 Jabber 客户端,该客户端使用他的 Facebook-id、令牌等进行授权,我正在使用 xmpp4r GEM 进行此操作。

使用令牌连接的 facebook 帐户和 facebook 数据作为 Mailman 对象存储在数据库中。Mailman 类还有控制 Jabber 客户端的方法,如 run_client、connect_client、authorize_client、stop_client、get_client 等。对我来说最重要的方法是 connect_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 任务正在使用不同的应用程序初始化,所以 Mailman.find(x).get_client 将始终返回 nil,即使它返回 Jabber: : 生产应用程序中的客户端对象。

你是如何处理这些问题的?例如,是否可以为 Jabber::Client 对象获取指向内存的指针并将其保存到数据库中,以便任何其他应用程序的初始化都可以使用它?我不知道如何做到这一点。感谢您的任何建议!

4

1 回答 1

1

即使您设法在数据库中存储“指向内存的指针”,它对 cron 作业也没有用。cron 作业作为一个新进程启动,操作系统确保它无法访问任何其他进程的内存空间。

最好的方法是创建一个控制器来管理正在运行的 XMPP 客户端。这将为您的 cron 作业提供一个宁静的 API,允许您使用 HTTP 请求终止空闲客户端。

于 2014-04-03T13:57:06.720 回答