Liberty 不支持对 EJB 远程接口进行出站或入站事务传播。缺省情况下,EJB bean 为容器管理型,使用 Required 事务属性。因此,缺省情况下,未指定任何 container-transaction 属性的现有 EJB 定义将配置为使用事务(虽然不受支持)。
此规则会标记引用以下 EJB 注释(指示使用远程业务或 home 接口)的 Java 代码:
javax.ejb.Remotejavax.ejb.RemoteHome此规则还将标记 ejb-jar.xml 文件中的以下引用:
<remote/><business-remote/>
EJB 规范需要支持出站事务传播的产品仍发送空的事务上下文。
此上下文必须由使用 Required(缺省值)、Mandatory 或 Supports 事务属性的 EJB 组件拒绝。具有活动全局事务的客户机无法启动具有缺省事务属性的 EJB bean(如果此客户机或服务器位于 Liberty 上)。
为了让客户机能够启动 EJB bean,请将 EJB bean 更改为使用 RequiresNew 或 NotSupported 事务属性。虽然这些属性将允许 EJB bean 启动,但未在执行客户机事务的过程中落实由 EJB bean 完成的事务工作。
请注意,在同一 JVM 中运行的 EJB 远程接口支持事务传播,但这只能通过进一步调查应用程序行为来确定。
通常,EJB 2.x bean 在 ejb-jar.xml 中配置远程接口,即使未使用也是如此。只有在两个不同 JVM 之间运行代码时,才需要远程接口。在 WebSphere 术语中,这是在两个不同应用程序服务器之间或者客户机应用程序与在不同 JVM 中运行的应用程序服务器之间。EJB 查找中的 CORBA 信息(例如,iiop:// 提供程序 URL)也是正在使用远程 EJB bean 的指示符。
如果使用在同一 JVM 中运行的远程接口来引用 EJB bean,那么可以使用本地接口并且执行效果更好。在可能的情况下,将注释从 @Remote 更改为 @Local,从 @RemoteHome 更改为 @LocalHome,并测试所所有代码方案。同样,对于 ejb-jar.xml 配置,移除 <remote/> 和 <business-remote/> 定义,然后测试所有方案。虽然此方案支持事务传播,但最佳做法是转换为使用本地接口以提高性能,并移除可从同一 JVM 外部调用方法的感知。
对于需要远程访问的这些 EJB bean,最佳做法是将它们打包在 Web Service 中。请参阅注释 EJB bean 以创建 Web Service,从而获取有关使用 WebSphere Application Server Developer Tools for Eclipse 进行这些代码更改的指示信息。在 Web Service 中打包 EJB bean 后,使用 Web Service 客户机以调用 EJB Web Service。测试后,可移除 EJB 远程注释或配置。
有关相关主题的更多信息,请参阅