Указатель на объект в базе данных

У меня есть приложение rails, где каждый пользователь может подключить свою учетную запись Facebook и дать разрешение на отправку сообщений из приложения, которое использует. Итак, каждый зарегистрированный пользователь с подключенной учетной записью Facebook должен иметь один Jabber-клиент, авторизованный с его идентификатором Facebook, токеном и т. Д., Я делаю это с помощью 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: : Клиентский объект в производственном приложении.

Как вы справляетесь с такими проблемами? Например, можно ли получить указатель на память для объекта Jabber :: Client и сохранить его в базе данных, чтобы его можно было использовать при инициализации любого другого приложения? Я понятия не имею, как этого добиться. Спасибо за любой совет!


person Radoslaw    schedule 16.03.2014    source источник


Ответы (1)


Даже если вам удастся сохранить «указатель на память» в своей базе данных, он будет бесполезен для работы cron. Задание cron запускается как новый процесс, и ОС гарантирует, что у него не будет доступа к пространству памяти любого другого процесса.

Лучший способ - создать контроллер для управления вашими запущенными клиентами XMPP. Это обеспечит успокаивающий API для вашей работы cron, позволяя вам отключать бездействующих клиентов с помощью HTTP-запросов.

person Simon Kaczor    schedule 03.04.2014
comment
Спасибо, так и надо делать. Некоторое время назад мой друг указал мне на это решение, и я не вернулся к этой теме, поэтому я только что принял ваш ответ. - person Radoslaw; 15.04.2014