すべてのユーザーが自分の Facebook アカウントを接続し、使用しているアプリからメッセージを送信する許可を与えることができる Rails アプリがあります。したがって、接続された Facebook アカウントを持つすべてのログイン ユーザーは、Facebook ID、トークンなどで認証された 1 つの Jabber クライアントを持っている必要があります。私は xmpp4r GEM でそれを行っています。
接続された facebook アカウントとトークン、および facebook データはデータベースに Mailman オブジェクトとして保存されます。Mailman クラスには、run_client、connect_client、authorize_client、stop_client、get_client などの Jabber クライアントを制御するメソッドもあります。私にとって最も重要なメソッドは 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 オブジェクトには Jabber::Client オブジェクトを返す必要がある get_client メソッドがあり、@@clients 変数が格納されるのは実行中のアプリケーションの範囲内だけであるため、実際に動作しています。特定の実行中のアプリ。
アイドル状態のクライアントを閉じるために cron タスクを使用したいのですが、cron タスクはアプリの別の初期化を使用しているため、これは私にとって問題です。 :本番アプリのクライアント オブジェクト。
このような問題にどのように対処していますか?たとえば、Jabber::Client オブジェクトのメモリへのポインタを取得してデータベースに保存し、他のアプリの初期化で使用できるようにすることは可能ですか? それを達成する方法がわかりません。アドバイスありがとうございます!