取消ActiveMQ消息

时间:2017-08-25 08:23:58

标签: java 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); (?)

用例是,由于任何原因,不再需要执行任务,并且任务耗费资源。

3 个答案:

答案 0 :(得分: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,......)?

答案 1 :(得分:0)

如何设置邮件的到期时间? http://activemq.apache.org/how-do-i-set-the-message-expiration.html

如果您希望在特定时间范围内未处理/消费消息,则消息过期似乎是我的答案。

答案 2 :(得分:0)

对于那些正在寻找直接答案的人,有一个 JMS API 来控制这种行为:

每个JMS API docs

<块引用>

setTimeToLive(long timeToLive)

指定使用此 JMSProducer 发送的消息的生存时间。

所以你可以在发送之前在生产者上设置这个值:

...
producer.setTimeToLive(30000L);
producer.send();

使用此特定设置,消息将在被消息代理删除之前保留 30 秒