【问题标题】:JMS Sessions, "transacted" and "auto-acknowledge"JMS 会话,“交易”和“自动确认”
【发布时间】:2018-07-07 07:34:43
【问题描述】:

JMS 会话到底是什么意思?

JMS 会话可以“事务”或不“事务”是什么意思?

JMS 会话可以带“自动确认”或不带“自动确认”是什么意思?

【问题讨论】:

    标签: jms jms-topic


    【解决方案1】:

    所有信息都在 JMS 规范here 中 JMS Session 是一个保持与 JMS Provider 的连接以发送和接收消息的对象。

    事务处理会话支持单个事务系列。每个事务将一组产生的消息和一组消费的消息组合成一个原子工作单元。实际上,事务将会话的输入消息流和输出消息流组织成一系列原子单元。交易时 提交,其输入的原子单元被确认,并且其关联的原子 发送输出单位。如果一个事务回滚完成,它产生的消息 被销毁并自动恢复其消耗的消息。

    另一方面,在具有自动确认功能的 JMS 会话中,收到的消息在传递到应用程序后会自动从 JMS 提供程序中删除,而无需应用程序调用提交/回滚。自动确认对事务会话没有影响。

    【讨论】:

      【解决方案2】:

      您可以将 JMS 会话视为连接和线程在该连接上的工作之间的链接。 JMS 会话是一个“单线程上下文”,因此每个线程必须使用不同的会话。相反,一个 JMS 连接可以在多个线程之间共享。此外,一个线程可以拥有多个会话。

      会话上的发送/接收操作是确认已处理

      想象一下消费者崩溃:如果消费者说它还没有处理消息,通常你想重新传递一条消息。所以一个确认(ACK)可以从消费者发送到Broker,告诉JMS Broker消息已经被处理。不仅收到,而且还存储在数据库中,或者消费者正在做的任何工作。如果消费者在崩溃后重新启动,它将收到所有尚未确认的消息。

      有不同形式的 ACK:自动确认意味着 API 会在您从回调返回后为您调用确认()。在其他情况下,您必须自己调用 acknowledge()。

      Transactions 将该会话上的发送或接收操作分组(全有或全无)。所以你发送/发送/发送然后提交并知道所有 3 个消息在提交时对消费者可用,或者没有。交易交付的优点:交付的最高保证,您可以分组操作 - 缺点:延迟和可能的性能。

      Session 的一个主要目的是保持事务的状态。如果您的会话是为了进行事务而创建的 (SESSION_TRANSACTED),它知道您计划在事务中发送的所有消息,以及该事务是否已提交或回滚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 2014-10-29
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        相关资源
        最近更新 更多