2
我有一個JMSReceiver類正在MQ Queue上偵聽。該類實現MessageListener接口。我希望通過讓消息回滾來實現邏輯以重試指定次數的消息。爲此,我必須捕獲業務異常並將其包裝在RuntimeException中,以便將消息回滾到MQ並重播。我希望以更好的方式實現這一點。JMS 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(),但是當我這樣做時,重新傳遞計數不會增加,我可以重放消息。請建議更好的實現方法?
我有那個代碼和拋出異常的代碼在確認之前。所以在例外的情況下,message.acknowledge永遠不會被調用。信息仍然沒有回滾。我不得不把這個運行時異常讓消息回滾 – 2015-02-11 14:21:02
我想你需要檢查你的會話創建代碼。我更新了我使用的代碼片段。消息正在重新發送到我的應用程序 – Shashi 2015-02-11 15:01:57
嗨Shashi,我檢查了我的代碼,並且我們正在使用多線程,所以如果其他線程確認消息所有消息befor ethe消息得到承認。拋出runtimeexception讓消息回滾的不良後果是什麼? – 2015-02-17 07:06:39