我不确定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)
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 秒