2017-08-25 2 views
0

をキャンセル消費者。は、私はActiveMQのはここに適切なツールであれば、私の考えは、それまでに消費され、タスクを投稿するにActiveMQを使用していたので...</p> <p>私は、タスクキューおよび複数のコンシューマを持ってわからないActiveMQのメッセージ

しかし、私はそれがまだ処理されなかった場合は、タスクをキャンセルできるようにする必要があります...

はActiveMQのでキューからメッセージを削除するためのAPIはありますか?

Destination destination = session.createQueue(TOPIC_NAME); 
MessageProducer producer = session.createProducer(destination); 
ObjectMessage message = session.createObjectMessage(jobData); 
producer.send(message); 
... 
producer.cancel(message); (?) 

ユースケースは、何らかの理由で、タスクを実行する必要がなくなり、タスクがリソースを消費するということです。

+0

指定した時点で消費者に配信されない場合は、メッセージをキャンセルすることを意味しますか? –

+0

@SagarRohankar正確には、いったん配信されると、キューに入れられなくなります... –

+0

これは役立ちます:http://activemq.apache.org/how-do-i-purge-a-queue.html –

答えて

0

ActiveMQは、この種の操作を可能にするJMXインターフェイスを公開します。 Queueをモデル化するMBean(たとえば、org.apache.activemq:type = broker、brokerName = amq、destinationType = Queue、destinationName = my_queue)は、メソッドremoveMessage(String id)を公開します。また、特定のパターンに一致するメッセージを削除するメソッドもあります。

私の知る限り、この機能はJMXの外部に公開されていません。

しかし...

私は、特定のメッセージに取り組んでJMX操作のみをメモリにページングされるメッセージに取り組むことを嫌な気持ちを持っています。デフォルトでは、通常、キューの先頭に最も近い400のメッセージになります。私はこれがセレクタ操作に当てはまることは知っていますが、JMXについてはわかりません。

一部のActiveMQメッセージストア(JDBCストアなど)は、基礎となるメッセージデータにアクセスして操作する方法を提供する場合もあります。リレーショナルデータベースでは、JMS操作で「飛んでいる」メッセージはデータベースレベルでロックされるため、通常これは安全です。しかし、これは簡単な仕事でなければならないもののための多くの面倒です。

JMSが本当にこの仕事のための適切な技術だと思いますか?ランダムアクセスのためのものではありません。おそらく、ある種の分散データキャッシュがうまくいくでしょう(jgroups、Hazelcast、...)?

関連する問題