gpt4 book ai didi

java - JMS MQ实现不抛异常的重试逻辑

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:34 25 4
gpt4 key购买 nike

我有一个正在监听 MQ 队列的 JMSReceiver 类。此类实现 MessageListener 接口(interface)。我希望通过让消息回滚来实现重试消息指定次数的逻辑。为此,我必须捕获业务异常并将其包装在 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() 但是当我这样做时,重新传递计数不会增加,我可以重播消息。请提出更好的实现方法?

最佳答案

您可以使用 CLIENT_ACKNOWLEDGE 创建 JMS session 作为消息确认模式。然后在 onMessage() 方法中,不要调用 msg.Acknowledge()。不调用 msg.Acknowledge() 将确保再次发送相同的消息。

session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

请注意,对一条消息调用 Acknowledge() 将确认自上次调用该方法以来收到的所有消息。

更新

session 创建

    connection = cf.createConnection("user","password");
System.out.println("Connection created.");
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
System.out.println("Session created.");

OnMessage() 方法 - 消息在第 6 次尝试时被确认。

    consumer.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
try {
// Display the message that just arrived
System.out.println(msg);

if(msg.getIntProperty("JMSXDeliveryCount") > 5){
msg.acknowledge();
}
} // end try
catch (Exception e) {
System.out.println("Exception caught in onMessage():\n" + e);
}
return;
} // end onMessage()
}); // end setMessageListener

关于java - JMS MQ实现不抛异常的重试逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28454828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com