【发布时间】:2015-02-11 23:01:51
【问题描述】:
我有一个正在侦听 MQ 队列的 JMSReceiver 类。此类实现 MessageListener 接口。我希望通过让消息回滚来实现重试消息指定次数的逻辑。为此,我必须捕获业务异常并将其包装在 RuntimeException 中,以便消息回滚到 MQ 并重播。我希望以更好的方式实现这一点。
当前实施
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")<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");
}
}
}
预期 上述实现有效。它将消息回滚到 MQ 并且重新传递计数增加。我什至尝试过 session.rollback() 但是当我这样做时,重新发送计数不会增加,我可以重播消息。请建议一个更好的方法来实现这个?
【问题讨论】: