【问题标题】:Store pointer to object in database在数据库中存储指向对象的指针
【发布时间】:2014-04-21 12:15:46
【问题描述】:

我有一个 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 和 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 任务正在使用不同的应用程序初始化,所以 Mailman.find(x).get_client 将始终返回 nil,即使它在生产应用程序中返回 Jabber::Client 对象。

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

【问题讨论】:

    标签: ruby-on-rails ruby database pointers xmpp4r


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这正是它应该做的方式。我的朋友前段时间向我指出了该解决方案,但我没有回过这个帖子,这就是为什么我刚刚接受了您的回答。
    猜你喜欢
    • 2014-12-19
    • 2021-05-20
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多