【问题标题】:Websphere Liberty : JMS Sessions don't workWebsphere Liberty:JMS 会话不起作用
【发布时间】:2020-06-19 07:28:11
【问题描述】:

我正在将 EJB 应用程序从 websphere 9.0 迁移到 Liberty。我正在使用应用程序服务器迁移实用程序来帮助我进行迁移。列出的问题之一是:

移植的本地事务 JMS 会话在 Liberty 中不起作用

我查看了帮助中提到的细节,但从细节中我无法理解。

【问题讨论】:

  • 你能详细说明你不明白的地方吗?它将帮助回答者知道如何指导您。

标签: jms ejb websphere-liberty


【解决方案1】:

JMS 会话通常可以在 Liberty 中工作。但是,transacted JMS 会话将不起作用。因此,使用移植到 Liberty 的事务型 JMS 会话的应用程序将无法按预期工作。

事务处理的 JMS 会话允许客户端将不同的 JMS 操作(例如发送和使用消息)收集到一个以原子方式提交或回滚的工作单元中。

需要明确的是,事务处理的 JMS 会话使用有时称为“本地”事务的东西,因为该事务仅适用于所涉及的特定 JMS 会话。这与“全局”事务(有时称为“JTA”或“XA”事务)形成对比,后者可能涉及许多不同类型的资源(例如 JMS、JDBC 等),并且其提交和回滚是原子性的。所有这些资源。

【讨论】:

  • 如果您有一个全局事务,那么 JMS 工作将按照 Java EE 规范的要求进行事务处理和协调。使用 session.commit()、session.rollback() 或 JMSContext 等效项来执行 JMS 本地事务是行不通的。
  • 当然。我没有解决全球交易。我只是指的是事务处理的 JMS 会话,这就是问题所在。我将更新我的答案以澄清这一点。
【解决方案2】:

JMS API 提供了在单个事务中批量发送和接收多个消息的方法。这些方法旨在用于非托管客户端环境。您执行此操作的方式是创建事务处理会话(或 JMSContext),然后调用提交或回滚方法。

在托管环境中,规范有效地表明您不能这样做,并且已处理的参数将被忽略。这是因为如果您在全局事务中进行 JMS 工作,那么工作需要与该事务协调,因此提交/回滚没有意义。

传统的 WebSphere Application Server(出于历史原因)允许您在使用 IBM MQ 时创建事务 JMS 会话并在全局事务之外调用提交和回滚(如果您在其中,则遵循规范强制行为)。

有问题的规则是寻找事务处理的 JMS 会话或 JMSContext 的创建并报告可能的问题。

如果您的代码在全局事务中运行,则这是误报,您可以忽略它。如果您在全局事务之外运行并使用 MQ JMS 提供程序,那么您应该检查您的代码以执行以下操作之一:

  1. 将代码移动到全局事务中
  2. 重写代码以停止依赖提交/回滚方法

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2018-10-30
    • 2010-11-04
    • 2014-07-09
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多