Search code examples
activemq-artemis

Holding Messages for 10 Seconds in ActiveMQ Artemis


I am using WebSphere for both the web server and app server. The web server connects to ActiveMQ Artemis using JMS, while the app server connects to ActiveMQ Artemis using a resource adapter. Once a request comes into the web server, it is sent to an ActiveMQ Artemis queue, and then the request is sent to the consumer. However, I want to hold that message for 10 seconds before it is delivered to the consumer.

Is it possible to achieve this in ActiveMQ Artemis?

Here's some of my broker.xml:

  <address-settings>
    <address-setting match="#">
      <dead-letter-address>DLQ</dead-letter-address>
      <expiry-address>ExpiryQueue</expiry-address>
      <redelivery-delay>0</redelivery-delay>
      <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
      <max-size-bytes>-1</max-size-bytes>
      <message-counter-history-day-limit>10</message-counter-history-day-limit>
      <address-full-policy>PAGE</address-full-policy>
      <auto-create-queues>true</auto-create-queues>
      <auto-create-addresses>true</auto-create-addresses>
      <auto-create-jms-queues>true</auto-create-jms-queues>
      <auto-create-jms-topics>true</auto-create-jms-topics>
      <auto-delete-queues>false</auto-delete-queues>
      <auto-delete-addresses>false</auto-delete-addresses>
      <auto-delete-jms-queues>false</auto-delete-jms-queues>
      <auto-delete-jms-topics>false</auto-delete-jms-topics>
      <expiry-delay>60000</expiry-delay>
    </address-setting>

Solution

  • It is possible for the broker to "hold" a message for an arbitrary amount of time using scheduled messages. For example, in your producer code do something like this:

    TextMessage message = session.createTextMessage("This is a scheduled message message which will be delivered in 10 sec.");
    message.setLongProperty("_AMQ_SCHED_DELIVERY", System.currentTimeMillis() + 10000);
    producer.send(message);