如何在 ActiveMQ Artemis 中调度消息
Posted
技术标签:
【中文标题】如何在 ActiveMQ Artemis 中调度消息【英文标题】:How to schedule a message in ActiveMQ Artemis 【发布时间】:2021-12-26 11:21:46 【问题描述】:我这里有一个 Artemis 的 bootstrap.xml
配置文件
<broker xmlns="http://activemq.org/schema" schedulerSupport="true">
<jaas-security domain="activemq"/>
<server configuration="file:/opt/activemq/apache-artemis-home/etc//broker.xml"/>
<web bind="http://10.0.34.96:8161" path="web">
<app url="activemq-branding" war="activemq-branding.war"/>
<app url="artemis-plugin" war="artemis-plugin.war"/>
<app url="console" war="console.war"/>
</web>
</broker>
即使 artemis 服务器重新启动,调度消息仍然不起作用。消费者立即从TEST
队列中获取消息。
try
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://10.0.34.96:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create Destination queue
Destination queue = session.createQueue("TEST");
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
long schedDelivery = System.currentTimeMillis() + 50000;
String msg = "Hello World (test SCHED_DELIVERY) "+schedDelivery;
TextMessage message = session.createTextMessage(msg);
// message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 100000);
message.setLongProperty("_HQ_SCHED_DELIVERY", schedDelivery);
System.out.println("Producer Sent: " + msg);
producer.send(message);
session.close();
connection.close();
catch (Exception ex)
System.out.println("Exception Occured");
有人知道如何设置ScheduledMessage.AMQ_SCHEDULED_DELAY
或_HQ_SCHED_DELIVERY
属性吗?
【问题讨论】:
【参考方案1】:在新的 Artemis 客户端中使用 _HQ_SCHED_DELIVERY
将不起作用。这是旧版 HornetQ 客户端使用的旧属性。您需要使用_AMQ_SCHED_DELIVERY
。为方便起见,此属性在 org.apache.activemq.artemis.api.core.Message
中定义,因此您可以使用类似的内容。
另外,请记住,预定交货时间是绝对时间,而不是相对时间。
把它放在一起,你可以使用这样的东西:
import org.apache.activemq.artemis.api.core.Message;
...
long time = System.currentTimeMillis();
time += 5000;
jmsMessage.setLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME.toString(), time);
或者你也可以使用类似的东西:
jmsMessage.setLongProperty("_AMQ_SCHED_DELIVERY", System.currentTimeMillis() + 5000);
ActiveMQ Artemis 随附 an example examples/features/standard/scheduled-message
,它演示了所有这些。
您可以在the documentation 中阅读有关预定消息的更多信息。
最后,您不需要在bootstrap.xml
中设置schedulerSupport="true"
。该设置仅适用于 ActiveMQ“经典”而不是 ActiveMQ Artemis。此外,ScheduledMessage.AMQ_SCHEDULED_DELAY
同样适用于 ActiveMQ“经典”。
【讨论】:
【参考方案2】:您可以使用 ActiveMQMessage.setJMSDeliveryTime(schedDelivery) 或者这会起作用:message.setLongProperty("_AMQ_SCHED_DELIVERY", schedDelivery)
【讨论】:
以上是关于如何在 ActiveMQ Artemis 中调度消息的主要内容,如果未能解决你的问题,请参考以下文章
带有独立 ActiveMQ 的 Wildfly 上的 ActiveMQ Artemis
Centos 下activemq 升级到apache-artemis
如何使用嵌入式 ActiveMQ Artemis 为 Spring Boot 配置 max-delivery-attempts?