【问题标题】:Whats the point of transactional non xa JMS Sessions?事务性非 xa JMS 会话有什么意义?
【发布时间】:2011-02-10 11:08:44
【问题描述】:

是我自己还是 JMS API 在如何建模 Transacted 和 XA Transacted 等效项方面不一致?

我不完全理解为什么有 ConnectionFactory、QueueConnectionFactory、Session 等的 XA 形式以及如此多的重复:

例如

XAQueueConnection

    XAQueueSession
    createXAQueueSession() throws JMSException;

    QueueSession
    createQueueSession(boolean transacted,
                       int acknowledgeMode) throws JMSException;

包含非事务性和事务性会话的方法?

  • 为什么两者都有?
  • 如果我有一个 XAQC,为什么我需要一个非事务性 QS?
  • 如果我愿意,我为什么要创建 XAQueueConnection?

【问题讨论】:

    标签: java jms


    【解决方案1】:

    这些提供了服务等级的梯度。 JMS 允许...

    • 工作单元之外的消息
    • 单阶段提交 (1PC) 内的消息
    • 两阶段提交 (2PC / XA)​​ 中的消息

    每一项的成本都随着可靠性的程度而增加。通常,您希望使用应用程序所需的成本最低的方法。如果您有一个非持久的、即将过期的、即发即弃的消息(例如,股票行情事件),将其放在工作单元中是一种浪费。同样,如果您需要事务处理会话,但 JMS 是您唯一的资源管理器,那么 XA 将是一种浪费。

    另一方面,如果某些操作确实需要 XA,这并不意味着您应该对所有操作都使用 XA。例如,您可能有一个连接,在该连接中您维护一个用于 XA 事务的会话和另一个用于非 XA 消息传递的会话。首先是接收对长时间运行进程的请求并使用进程详细信息更新数据库。另一个会话用于发送定期状态更新。连接必须是 XAConnection,但出于性能目的,您需要在其下同时存在 XA 和非 XA 会话。您也可以维护单独的连接,但此方法允许您在单个连接中执行 XA 和非 XA 消息传递。对于具有许多连接的代理,这种优化可能至关重要。

    诚然,这不是一个非常常见的用例,但它仍然是一个有效的用例,并且足以包含在规范中。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多