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>
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);