微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ejb 2.X

如何解决使用 ejb 2.X

我正在使用 ejb 2.x 与 WebSphere Liberty 进行 solace 集成,因为该项目是基于 ejb 2.X 编写的。我发现了很多使用带有 ejb 3 的 solace 资源适配器的示例,但找不到任何使用 ejb 2.x 的示例。

有人可以在这里帮助我使用 WAS 中的 ejb 2(即 ejb-jar.xml、ibm-ejb-jar-bnd.xmi、server.xml 文件中的配置)配置 solace 资源适配器。

解决方法

由于 EJB 3.x 继续支持所有 EJB 2.x API,升级您的应用程序可能并不困难。在 ejb-jar.xml 中,您只需要将文件顶部从 2.x 更新到 3.x,其他一切保持不变。如果您在 ibm-ejb-jar-bnd.xmi 和/或 ibm-ejb-jar-ext.xmi 中有大量配置,事情会变得棘手,因为它们都需要转换为更新的 XML 等效项。升级的好处是 EJB 3.x 往往需要更少的 XML 配置,您可以利用注入的优势,这在 Solace 示例中使用。

但是,如果您想坚持使用 EJB 2.x,那么大部分现有的 Solace 示例仍然适用,您只需要将注释转换为 XML,添加缺少的 EJBLocalHome 接口,然后执行 JNDI 查找而不是注射。因此,假设您从这个 Solace EJB 3.x 示例开始,那么您需要将 @MessageDriven 转换为 message-driven@Stateless 转换为 session@EJB 转换为 { {1}} 和 ejb-local-ref@Resoruceresource-ref。最后,对这些引用执行 JNDI 查找以代替注入。

因为如果您不使用原始工具,修改现有的 EJB 2.x 应用程序可能会很棘手,所以我提供了以下关键配置部分,说明 Solace EJB 3.x 示例对于 EJB 2 的外观。 x:

首先,resource-env-ref 中的所有内容都将保持不变。

其次,Solace 示例中两个 bean 的 server.xml 看起来像这样:

ejb-jar.xml

EJB 3.x 示例注释已映射到它们的 XML 等效项,然后添加了 <message-driven id="MessageDriven_1050954917281"> <ejb-name>ConsumerMDB</ejb-name> <ejb-class>com.xxx.yyy.ConsumerMDB</ejb-class> <transaction-type>Bean</transaction-type> <ejb-local-ref id="EJBLocalRef_1037123589807"> <ejb-ref-name>ejb/Producer</ejb-ref-name> <ejb-ref-type>Stateless</ejb-ref-type> <local-home>com.xxx.yyy.ProducerHome</local-home> <local>com.xxx.yyy.Producer</local> <ejb-link>ProducerSB</ejb-link> </ejb-local-ref> </message-driven> <session id="Session_1051542150766"> <ejb-name>ProducerSB</ejb-name> <local-home>com.xxx.yyy.ProducerHome</local-home> <local>com.xxx.yyy.Producer</local> <ejb-class>com.xxx.yyy.ProducerSB</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> <resource-ref id="ResourceRef_101"> <res-ref-name>myCF</res-ref-name> <res-type>avax.jms.ConnectionFactory</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> <resource-env-ref id="ResourceEnvRef_102"> <resource-env-ref-name>myReplyQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref> </session> 接口。 EJB 3.x 示例没有提供 ProducerHome 接口,但显示它被注入到 MDB 中;可能打算使用无接口视图,但 EJB 2.x 需要 Producer 接口。

请注意,Producer 中的 id 值对于 EJB 2.x 很重要,因为它们用于将元素与 ejb-jar.xml 中的相应元素链接起来。

第三,需要 ibm-ejb-jar-bnd.xmi 文件将引用绑定到 server.xml 中声明的资源,如下所示:

ibm-ejb-jar-bnd.xmi

语法比 EJB 3.x 示例中较新的 <?xml version="1.0" encoding="UTF-8"?> <ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:commonbnd="commonbnd.xmi" xmlns:ejb="ejb.xmi" xmlns:common="common.xmi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmi:id="ejb-jar_ID_Bnd" currentBackendId="DB2UDBNT_V72_1"> <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/> <ejbBindings xmi:type="ejbbnd:MessageDrivenBeanBinding" xmi:id="MessageDrivenBeanBinding_1" activationSpecJndiName="JNDI/J2C/AS"> <enterpriseBean xmi:type="ejb:MessageDriven" href="META-INF/ejb-jar.xml#MessageDriven_1050954917281"/> <ejbRefBindings xmi:id="EjbRefBinding_1037123589787" jndiName="java:module/ProducerSB!com.xxx.yyy.ProducerHome"> <bindingEjbRef href="META-INF/ejb-jar.xml#EJBLocalRef_1037123589807"/> </ejbRefBindings> </ejbBindings> <ejbBindings xmi:id="EnterpriseBeanBinding_1037123589767" jndiName="ejb/ProducerSBHome"> <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#Session_1051542150766"/> <resRefBindings xmi:id="ResourceRefBinding_1" jndiName="JNDI/J2C/CF"> <bindingResourceRef href="META-INF/ejb-jar.xml#ResourceRef_101"/> </resRefBindings> <resourceEnvRefBindings xmi:id="ResourceEnvRefBinding_1" jndiName="JNDI/J2C/Q/replies"> <bindingResourceEnvRef href="META-INF/ejb-jar.xml#ResourceEnvRef_102"/> </resourceEnvRefBindings> </ejbBindings> </ejbbnd:EJBJarBinding> 复杂一些,但基本上它是将 XML 中声明的引用映射到 ibm-ejb-jar-bnd.xml 中资源的 jndi 名称,而 EJB 3.x 示例将通过注释声明的引用映射到 server.xml

中资源的 jndi 名称

最后,EJB 3.x 中的代码与 EJB 2.x 实现非常相似,只是 bean 需要实现 server.xmljavax.ejb.MessageDrivenBean 等。然后,在 { {1}} 方法,它们将执行 JNDI 查找(因为没有注入):

javax.ejb.SessionBean

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。