2017-08-25 164 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,...)?