1

これを達成する方法はありますか?

  • キューにメッセージを書き込む
  • 反対側にコンシューマーが存在するまで、プロデューサープロセスをブロックします
  • 10秒後にコンシューマーがない場合は、例外を発生させます
  • コンシューマーがいる場合は、プロデューサープロセスのブロックを解除します
  • 10秒のタイムアウトに達し、プロデューサー側で例外が発生した場合、コンシューマーが後でメッセージを消費できるように、メッセージをキューに保持する必要があります。

非同期的に消費者に通知できるようにしたいと思います。今までメッセージを送っています。直接のコンシューマーがあるかどうかを知りたいのですが、ない場合でも、メッセージはキューに残っているはずです。「即時の」amqpの動作ではないようです

4

1 に答える 1

1

興味深い問題ですが、残念ながらエレガントな解決策はありません。

RabbitMQ のドキュメントから、「即時」フラグは次のように機能します。

このフラグは、メッセージをすぐにキュー コンシューマーにルーティングできない場合の対応方法をサーバーに指示します。このフラグが設定されている場合、サーバーは Return メソッドで配信不能メッセージを返します。このフラグがゼロの場合、サーバーはメッセージをキューに入れますが、メッセージが消費されるという保証はありません。

即時フラグを使用して問題を部分的に解決できます。私は次のようなことを考えています:

  • プロデューサは、メッセージをキューに入れる準備ができると、即時フラグを設定してそれを起動します

  • メッセージが返された場合は、タイマーを開始し、即時フラグを設定して 10 秒間再試行し続けます。

  • 10 秒試行しても取得に失敗した場合は、immediate フラグを false に設定して公開します (これにより、コンシューマーがオンラインになったときにコンシューマーが取得できるようになります)。

于 2013-01-22T16:44:58.290 に答える