Ruby IMAP IDLE同時実行-対処方法

eventmachine imap multithreading ruby ruby-on-rails
Ruby IMAP IDLE同時実行-対処方法

IMAP IDLE接続を利用して、到着時に人々の電子メールを表示する(現時点ではプライベートな)Webアプリケーションを構築しようとしています。

これを一緒にハックする方法と、それがHeroku RoRサーバーとどのように適合するかを理解するのに苦労しています。

IMAPサーバーに接続してアイドリングするための基本的なスクリプトを作成しました。次のようなものです(簡略化)。

imap = Net::IMAP.new server, port, usessl
imap.login username, password
imap.select "INBOX"

imap.add_response_handler do |response|
  if resp.kind_of(Net::IMAP::UntaggedResponse) && resp.name == "EXISTS"
    # New mail recieved. Ping back and process.
  end
end

imap.idle
loop do
  sleep 10*60
  imap.renew_idle
end

これにより、IMAPサーバーへの接続が1つ作成され、アイドリングが開始されます。 ご覧のとおり、これはループでブロックされています。

ユーザーに対して複数のIMAP接続を同時にアイドル状態にしたいと思います。 最初は、次のようにそれぞれをスレッドに入れたいだけでした。

Thread.new do
  start_imap_idling(server, port, usessl, username, password)
end

私はまだスレッドを鋭くしていませんが、このソリューションでは、スレッドを待つためにメインスレッドをブロックする必要がありますか? だから私は何かのようにすれば:

User.each do |user|
  Thread.new do
    start_imap_idling(server, port, usessl, username, password)
  end
end

loop do
  # Wait
end

それは機能しますが、スレッドを実行できるようにするための下部のループがないわけではありませんか?

私の質問は、これをHeroku上のRuby On Railsアプリケーションと一緒にどのように溶かすのが最善かということです。 その最後のループでスレッドをブロックすることはできません-それを実行するにはどうすればよいですか? 別のサーバー? もっとダイノ-おそらく労働者? 私はEvent Machineについて少し読んでいます-これで私の問題を解決できますか?もしそうなら、これをどのように書くべきですか?

もう1つは、新しいimapクライアントを追加し、その場で現在のimapクライアントを削除できるようにすることです。 どう見える? おそらくキューを持つ何か?

ヘルプやコメントは大歓迎です!

  1  5


ベストアンサー

RoR、イベントマシンなどの詳細についてはよく知りません。 -しかし、プロデューサー/コンシューマーをセットアップしたいようです。

プロデューサーは、IMAPサーバーからの変更をリッスンするスレッドです。 変更を取得すると、それらをキューに書き込みます。 IMAP接続ごとに1つずつ、複数のプロデューサーをセットアップしたいようです。

コンシューマは、キューからの読み取りをブロックするスレッドです。 何かがキューに入ると、ブロックを解除してイベントを処理します。

その場合、メインスレッドは自由に何でもできます。 メインスレッドに、新しいIMAPクライアント(つまり、プロデューサー)の追加や、現在のクライアントの即時削除などの処理を実行してもらいたいようです。

これらを実行する場所については、1つの実行可能ファイル、同じマシンの別々の実行可能ファイル、または異なるマシンでコンシューマとプロデューサを実行できます…​ すべてあなたの状況に依存します。

HTH

0


タイトルとURLをコピーしました