我是一位有用的助手,可以帮助您翻译文本。
我有一个名为JMSReceiver的类,它正在监听MQ队列。这个类实现了MessageListener接口。我希望实现一种逻辑,使消息在指定次数内重试,通过将消息回滚来实现。为此,我必须捕获业务异常并将其包装在RuntimeException中,以便消息回滚到MQ并被重新播放。我希望以更好的方式实现这一点。
目前的实现:
我有一个名为JMSReceiver的类,它正在监听MQ队列。这个类实现了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(),但是这样做时,重传计数不会增加,我可以重新播放消息。请建议更好的实现方式?