【问题标题】:JMS transaction with exception handling带有异常处理的 JMS 事务
【发布时间】:2013-07-10 03:01:15
【问题描述】:

我正在设计 JMS 应用程序,它从队列接收消息并更新数据库中的列。我正在使用 tomcat 和消息侦听器来侦听消息(没有 MDB 和 Spring MDP'S)。在异常处理和事务处理方面,我想要最好的、稳健的设计,这样消息就不会丢失。

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

谢谢

【问题讨论】:

    标签: transactions jms


    【解决方案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();
    

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

    【讨论】:

      猜你喜欢
      • 2017-03-16
      • 2013-04-15
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2017-10-07
      • 2015-02-03
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多