title: JMS MQ Implement retry logic without throwing exception
body: <p>I have a JMSReceiver class which is listening on a MQ Queue. This class implements the MessageListener interface. I wish to implement the logic to retry a message for specified number of times by getting the message to rollback. To do so I have to catch the business exception and wrap it in a RuntimeException so that message gets rolled back to the MQ and gets replayed. i wish to implement this in better way.</p>
  
  <p><strong>Current Implementation</strong></p>
  
  <pre><code>class JMSReceiver implements MessageListener{
  public void onMessage(Message msg){
          logger.info("**********Message received in consumer");
           try {
               //Do some business which throws a business exception
           } catch (Exception e) {
              try {
                  logger.info("####Redelivery count"+msg.getIntProperty("JMSXDeliveryCount"));
                  if(msg.getIntProperty("JMSXDeliveryCount")&lt;10){
                      logger.info("####MQ ISSUE: Redelivery attempted for message. Redelivery attempt: "+msg.getIntProperty("JMSXDeliveryCount"));
                      throw new RuntimeException("Redelivery Attempted"+e.getMessage());                      
                  }else{
                      logger.info("####MQ ISSUE: Redelivery attempts exhausted for message");
                  }
              } catch (JMSException e1) {                 
                  e1.printStackTrace();
                  logger.info("####MQ ISSUE: Exception occured while getting JMSXDeliveryCount");
               }
        }
       } 
  </code></pre>
  
  <p><strong>Expected</strong>
  The above implementation works. It rollsback the message to MQ and the redelivery count increases. I even tried doing session.rollback() but when I do that the redelivery count does not increase and I can replay the message. Please advise a better way to implement this ?</p>