Websphere,JAXWS,WS-Transaction - WTRN0127E:操作被策略类型配置阻止

时间:2016-06-03 07:25:11

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

我们之前从未在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尝试了这一点,但它仍然无法解决问题。

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

2 个答案:

答案 0 :(得分:0)

我认为您已指定强制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协调是通过WS-AT进行Web服务的。考虑WS-AT PolicySet配置的方法是,在请求方,它确定是否在请求上传播线程上的现有JTA事务(以及是否应该警告事务必须存在) - 在提供者上它确定它是否应该在WS-AT事务上下文中导入和执行(如果存在),如果没有tran上下文,它是否有效调用服务。 希望这会有所帮助。

答案 1 :(得分:0)

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