我遇到的问题是,如果下面的方法失败或者是异常,我仍会使用msg。我希望功能在catch期间进行回滚,并将msg放回队列/主题。
public void onMessage(Message message)
{
String messageId = null;
Date messagePublished = null;
try
{
messageId = message.getJMSMessageID();
messagePublished = new Date(message.getJMSTimestamp());
LOGGER.info("JMS Message id =" + messageId + " JMS Timestamp= " + messagePublished);
process(message);
LOGGER.info(" returning from onMessage() successfully =" + messageId + " JMS Timestamp= " + messagePublished);
}
catch(Throwable t)
{
LOGGER.error("Exception:",t);
LOGGER.error(t.getStackTrace() + "\n Exception is unrecoverable.");
throw new RuntimeException("Failed to handle message.",t);
}
}
答案 0 :(得分:1)
您可以查看JMS中存在的不同确认模式。请参阅此文http://www.javaworld.com/javaworld/jw-02-2002/jw-0315-jms.html。
适合您的模式是客户端模式。 所以基本上,客户需要在他们满意时确认他们已经处理了消息。
您可以在调用process(消息)之后调用acknowledge,如果proccess(message)方法中发生异常,则消息不会因为您没有确认而出列。我们之前使用Oracle AQ这种方法,它运行良好。
这种方法意味着您不必担心队列中的消息的事务(数据库事务是另一个故事)。您唯一需要确保的是,您的应用可以使用潜在的重复消息处理对处理(消息)的调用
答案 1 :(得分:0)
你应该能够只使用onMessage方法进行交易。