具有异常处理的JMS事务

时间:2013-07-11 17:53:06

标签: transactions jms

我正在设计JMS应用程序,它从队列接收消息并更新数据库中的列。我正在使用tomcat和消息监听器来监听消息(没有MDB,也没有Spring MDP')。我希望在案例异常处理和事务处理中实现最佳,可靠的设计,以便消息不会丢失。

我应该使用jms会话事务模式还是jdbc事务。 或者只是jdbc事务就足够了(没有jms会话提交或回滚),因为这是一个数据库表更新。

由于

1 个答案:

答案 0 :(得分:1)

JDBC事务是不够的:如果您已读取消息,并且数据库操作失败,并且tomcat已关闭,则消息将丢失。


如果每条消息在数据库中触发插入/更新,您可以使用CLIENT_ACKNOWLEDGE模式:

    final boolean transacted = false;
    final int ackMode = Session.CLIENT_ACKNOWLEDGE;
    final QueueSession queueSession = queueConnection.createQueueSession(
            transacted, ackMode);

因此,您可以阅读该消息,并更新数据库。如果数据库更新成功,则可以使用

确认消息
    message.acknowledge();

如果没有acknowledge,则会重新传递消息:因此,重新启动tomcat后,您的消息侦听器应该再次看到该消息。您可以使用queueSession.recover()以编程方式重新开始传递。

由于tomcat可能在成功的数据库更新和确认之间关闭,因此您应确保正确处理重复的消息。


变体是使用交易会话:

    final boolean transacted = true;
    // 2nd parameter is ignored if the session is transacted
    final QueueSession queueSession = queueConnection.createQueueSession(
            transacted, -1);

在此模式下,您可以使用单个提交确认多条消息:

        queueSession.commit();

如果多条消息导致单个数据库操作(您必须先收集一些消息,然后才能更新数据库),则需要此模式。