如何在 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 中调度消息的主要内容,如果未能解决你的问题,请参考以下文章

Artemis安装

带有独立 ActiveMQ 的 Wildfly 上的 ActiveMQ Artemis

Centos 下activemq 升级到apache-artemis

如何使用嵌入式 ActiveMQ Artemis 为 Spring Boot 配置 max-delivery-attempts?

ActiveMQ 经典到 ActiveMQ Artemis 故障转移不起作用

ActiveMQ Artemis 复制无法正常工作