将onMessage()方法转换为原子操作

时间:2012-01-26 11:12:17

标签: java jms atomic

我遇到的问题是,如果下面的方法失败或者是异常,我仍会使用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);
    }

}

2 个答案:

答案 0 :(得分:1)

您可以查看JMS中存在的不同确认模式。请参阅此文http://www.javaworld.com/javaworld/jw-02-2002/jw-0315-jms.html

适合您的模式是客户端模式。 所以基本上,客户需要在他们满意时确认他们已经处理了消息。

您可以在调用process(消息)之后调用acknowledge,如果proccess(message)方法中发生异常,则消息不会因为您没有确认而出列。我们之前使用Oracle AQ这种方法,它运行良好。

这种方法意味着您不必担心队列中的消息的事务(数据库事务是另一个故事)。您唯一需要确保的是,您的应用可以使用潜在的重复消息处理对处理(消息)的调用

答案 1 :(得分:0)

你应该能够只使用onMessage方法进行交易。