1

キューを一時停止するように指示するために、ActiveMQブローカー管理コマンドを探していました-つまり:

  • プロデュースクライアントからのメッセージを引き続き受け付けます
  • 消費するクライアントへの配信を停止し、キューが再開されるまでキューのバックログが大きくなるのを許容し、その後、バックログがクライアントに送信されます。

そのようなコマンドは見つかりませんでした。最も一般的な答えは、クライアント エンドで管理する必要があるというものでした。つまり、すべてのコンシューマを見つけて停止するというものです。その他の回答は、クライアントとブローカーが通信できなくなるようにネットワーク ルートやファイアウォールを操作するなどの回避策でした。

他のメッセージ キューをざっと調べてみると、この点に関して ActiveMQ は珍しいものではないことがわかります。

この機能が実装されていない可能性がある理由は 2 つあります。

  • 実装するのは難しいですが、理由が思い浮かびません。
  • メッセージキューの設計思想に反する

それはどれですか。なぜですか。

4

2 に答える 2

6

キューを一時停止できる機能は、新しくリリースされた ActiveMQ 5.12.0 でサポートされています。

キューが「一時停止」されている場合:

  • 関連付けられたコンシューマーに送信されるメッセージはありません

  • まだキューに入れられていないメッセージ

  • キューを参照できる機能

  • キューのすべての JMX カウンターが使用可能で正しいこと。

...

実装された一時停止/再開/isPaused キュー ビュー mbean ops および属性

一時停止すると、通常のキュー コンシューマーへのディスパッチはなく、送信と閲覧は通常どおりに行われます。インフライト メッセージは、通常どおり ack されるまでインフライトを続けます。

https://issues.apache.org/jira/browse/AMQ-5229を参照してください。

Jolokia を有効にしている場合 (最近はデフォルトで有効になっていると思います)、次のような curl リクエストを使用してキューを一時停止できます。

curl --user admin:admin http://127.0.0.1:8161/api/jolokia/exec/org.apache.activemq:brokerName=localhost,destinationName=myQueue,destinationType=Queue,type=Broker/pause

(デフォルトのユーザー名、パスワード、ブローカー名、および myQueue というキューを使用)

キューを再開するには、「一時停止」を「再開」に置き換えます。

于 2015-08-23T09:30:14.747 に答える
4

あなたが言うように、おそらく実装するにはそれほど複雑ではありません。それが需要がなかったかどうかの積極的な設計決定であるかどうかはわかりません。IBM WebSphere MQなどの他の同様の製品は、キューに「get / putinhibited」を実装しているため、メッセージングの哲学に完全に反するものではなく、ライブシステムを操作してトラブルシューティングするためのツールです。

私は少し偏見がありますが、実際には送信者を受信者から切り離すのが好きです(2つの異なるシステムの場合、最終的には切り替え/アップグレード/変更される可能性があります)。

システムを切り離し、必要なことを実行できるようにする簡単な方法は、送信者が1つのキュー「DATA.OUT」に送信し、受信者が別の「DATA.IN」をリッスンするようにすることです。次に、Apache Camel(通常、エンタープライズ統合パターンを実現するためにActiveMQにバンドルされています)を使用して、DATA.OUTからDATA.INにルーティングできます。

キャメルルートは、JMXを介して開始/停止することができます。これにより、説明した内容と同様のことが実現します。

この問題のActiveMQ設計では、キューに直接配置するのではなく、ApacheCamelなどのミドルウェアレイヤーでこの種のことを実行する必要があると思います。

于 2013-02-18T20:37:27.980 に答える