2

すべてのユーザーが自分の 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 オブジェクトのメモリへのポインタを取得してデータベースに保存し、他のアプリの初期化で使用できるようにすることは可能ですか? それを達成する方法がわかりません。アドバイスありがとうございます!

4

1 に答える 1

1

データベースに「メモリへのポインタ」を保存できたとしても、cron ジョブには何の役にも立ちません。cron ジョブは新しいプロセスとして開始され、OS はそれが他のプロセスのメモリ空間にアクセスできないようにします。

最善の方法は、実行中の XMPP クライアントを管理するコントローラーを作成することです。これにより、cron ジョブに安らかな API が提供され、HTTP リクエストを使用してアイドル状態のクライアントを終了できるようになります。

于 2014-04-03T13:57:06.720 に答える