【问题标题】:How to schedule a message in ActiveMQ Artemis如何在 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 属性吗?

【问题讨论】:

    标签: java jms activemq-artemis


    【解决方案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)

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多