【问题标题】:Websphere, JAXWS, WS-Transaction - WTRN0127E: Operation blocked by policy type configurationWebsphere、JAXWS、WS-Transaction - WTRN0127E: 操作被策略类型配置阻止
【发布时间】:2016-10-03 03:59:01
【问题描述】:

我们之前从未在 Websphere 中使用过 WS-Transaction 策略,因此我正在开发一个原型来评估它。

这就是原型的结构。 我用eclipse开发了两个应用APP_A和APP_B。

  • APP_A 包含两个 JAXWS Web 服务 service_X 和 service_Y
  • service_X 接受最少的数据,将其写入 oracle 数据库的表中,然后在响应中返回主键
  • service_y 接受从 service_X 返回的主键和一些其他最小数据,将其写入同一个 oracle 数据库上的不同表,然后在响应中返回主键
  • APP_B 包含一个 JAXWS Web 服务 service_Z
  • service_z 接受向 service_x 和 service_y 发布请求所需的所有数据,并在响应中返回从 service_x 和 service_y 返回的主键

APP_A 和 APP_B 均部署到 Websphere 8.5.5.9,并且已经测试成功。

然后通过 Websphere 管理控制台,我创建了一个新的应用程序策略集,并包含了 ws-transaction 策略。然后我将此策略附加到 APP_A 中的提供程序策略和 APP_B 中的客户端策略,然后重新启动 Websphere。

然后我向 APP_B 提交了一个请求,从日志文件中我可以看到请求被 APP_B 中的 service_z 成功接收,但是当它尝试向 APP_A 中的 service_x 发布请求时,报告了以下错误:

[02/06/16 11:53:43:040 BST] 00000076 AxisEngine    E org.apache.axis2.engine.AxisEngine receive WTRN0127E: Operation blocked by policy type configuration.

我关注了 IBM 开发人员工作的几篇在线文章,这些文章都暗示一切都应该通过管理控制台应用策略来工作,但不幸的是我仍然遇到这个错误。

我怀疑我可能需要在服务调用的标头中包含一些内容,但我不确定这是什么或如何实现它。

其中一篇文章建议使用 IBM Rational Application Developer 工具,从管理控制台导出策略,然后在部署之前将它们导入到项目中。我按照说明使用 IBM RAD 9.11 进行了尝试,但仍然无法解决问题。

任何帮助/建议将不胜感激,在此先感谢您的帮助。

【问题讨论】:

标签: websphere jax-ws websphere-8 ws-transaction


【解决方案1】:

我认为您已指定强制 WS-AT 策略,但线程上没有 JTA 事务。假设您想在 APP_B 中启动一个事务并使用 WS-AT 将该事务传播到 service_X 和 service_Y 的请求上,以便在单个事务下协调所有工作。如果 service_Z 是 POJO,您可以使用 UserTransaction 开始/提交事务,或者您可以只使用对带有 CMT 的 EJB 的单个请求将多个 Web 服务请求包装到后端服务。注意 PolicySet 不会自动为您启动 JTA 事务 - 考虑 WS-AT 的最简单方法是它适用于 Web 服务,就像 JTS/OTS 用于 CORBA/IIOP(即 EJB 请求)一样 - 所以事务生命周期是通过 JTA在 J2EE 应用程序服务器中,事务传播和 2PC 协调是通过 Web 服务的 WS-AT。考虑 WS-AT PolicySet 配置的方式是,在请求者端,它确定线程上现有的 JTA 事务是否在请求上传播(以及它是否应该监管事务必须存在) - 在提供者上- 它决定是否应该在 WS-AT 事务上下文(如果存在)下导入和执行,以及如果不存在 tran 上下文,调用服务是否有效。 希望这会有所帮助。

【讨论】:

  • 嗨,丹,感谢您迄今为止的帮助。我将在下面添加一些 cmets 来回答您提出的问题。
  • 是的,这是正确的,ws-transaction 策略设置为强制
  • APP_A 包含 service_X 和 service_Y,这两个服务彼此独立工作,从 WebSphereUowTransactionManager 获取事务。 APP_B 本质上是一个带有注释的 POJO,使其成为调用 service_X 和 service_Y 的 JAXWS 服务。
  • 我不想使用 EJB。当 service_Z 被调用时,它会构建一个请求并提交给 service_X,然后构建一个请求并提交 service_Y。目前它本身并没有创建事务,从阅读文章中我推测 websphere 在通过管理控制台应用策略集后会创建和管理事务。我是否需要修改 APP_B 使其显式创建事务以使其正常工作?
  • 不确定您指的是 Spring 类 WebSphereUowTransactionManager 还是 WebSphere 的 UOWManager。如果您想要所有 Web 服务在其下执行的单个事务,您需要在 service_Z 中启动它 - 因为我们似乎在谈论 POJO/模拟 servlet,那么在标准 J2EE 中您只需在 jndi 中查找 UserTransaction 接口并调用 begin /commit(如果您使用的是 Spring,那么它们的接口将在幕后做同样的事情 - 在应用服务器中,它只是一个与当前线程相关联的 JTA 事务)。
【解决方案2】:

不确定您指的是 Spring 类 WebSphereUowTransactionManager 还是 WebSphere 的 UOWManager。如果您想要所有 Web 服务在其下执行的单个事务,您需要在 service_Z 中启动它 - 因为我们似乎在谈论 POJO/模拟 servlet,那么在标准 J2EE 中您只需在 jndi 中查找 UserTransaction 接口并调用 begin /commit(如果您使用的是 Spring,那么它们的接口将在幕后做同样的事情 - 在应用程序服务器中,它只是一个与当前线程相关联的 JTA 事务)。 使用为强制 WS-AT 配置的 PolicySet,该事务将在 JAX-WS 请求上传播,并且目标服务将在该事务下执行,因此您不需要(或不希望)与 JTA 事务管理器(vanilla JTA)进行任何显式交互或 Spring)在这些服务中。
另一方面,如果您只是希望 PolicySet 配置将在 service_X 和 service_Y 中创建单独的事务,例如,对于 CMT EJB 具有Required/RequiresNew,因此您不需要显式代码来确定事务范围,那么恐怕没有'不是等效的 WS-AT 策略集。它基本上是用于事务范围的 JTA 和用于传播/2PC 的 WS-AT,其策略集配置允许对传播进行一些配置。

【讨论】:

  • 这是service_X和service_Y在APP_A中使用的事务管理器是org.springframework.transaction.jta.WebSphereUowTransactionManager
  • 我将尝试修改 APP_B,以便在调用 service_Z 时显式创建 UserTransaction,调用 begin,然后调用 service_X 和 service_Y,最后调用 commit。我会让你知道会发生什么。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2020-09-11
  • 2021-04-16
  • 2018-02-26
  • 2019-11-19
  • 2020-09-12
  • 2017-06-19
  • 2022-01-14
相关资源
最近更新 更多