How to move error message to IBM MQ dead letter queue using java?

999 Views Asked by At

Currently, my program is processing the messages being received from a queue but we encountered a xml file that has an error and what happens is it keeps looping on the same message and retrying to process it.

I would like to move the message to dead letter queue when a message like this occurs again.

What I did right now is that I created a class that will "producer.send(destination, msg)" to the dead queue and call this function on the try-catch but it seems that it is not working.

1

There are 1 best solutions below

0
On

As @JoshMc hinted you should be treating the error messages as poison messages. For that you will need to enable transactions, and invoke a rollback for the error message.

ie. logic that looks like


// Create a connection factory
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);

JmsConnectionFactory cf = ff.createConnectionFactory();

//Set connection properties
...

context = cf.createContext(JMSContext.SESSION_TRANSACTED);
try {
    ... 
    // Message Processing
    ...
    // All is OK
    context.commit();
} catch (Exception e) {
    // Message processing failed
    context.rollback();
}
                                                                

If a backout queue and backout threshold is set then the poison message is put on to the backout queue (BOQNAME) after BOTHRESH attempts at handling the message.

All this is done for you, by the underlying MQ Client code.

There is an explanation in this article - https://developer.ibm.com/articles/an-introduction-to-local-transactions-using-mq-and-jms/

which also links to sample code here - https://github.com/ibm-messaging/mq-dev-patterns/tree/master/transactions/JMS/SE