什么是交易非xa JMS会话的重点?

时间:2011-02-09 08:03:06

标签: java jms

仅仅是我还是JMS API在如何为Transacted和XA Traacted等效物建模方面不一致?

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

例如

XAQueueConnection

    XAQueueSession
    createXAQueueSession() throws JMSException;

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

包含非交易和交易会话的方法?

  • 为什么两个?
  • 如果我有XAQC,为什么我要一个非交易QS?
  • 如果我想要为什么要创建XAQueueConnection?

1 个答案:

答案 0 :(得分:4)

这些提供了一系列服务梯度。 JMS允许......

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

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

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

不可否认,这不是一个非常常见的用例,但它仍然是一个有效的案例,并且已经包含在规范中。