2017-08-25 210 views
0

我不知道如果ActiveMQ是一個合適的工具在這裏...取消ActiveMQ消息

我有一個任務隊列和多個消費者,所以我的想法是使用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接口。模擬隊列的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,...)?