如何解决使用 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
到 @Resoruce
和 resource-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
最后,EJB 3.x 中的代码与 EJB 2.x 实现非常相似,只是 bean 需要实现 server.xml
和 javax.ejb.MessageDrivenBean
等。然后,在 { {1}} 方法,它们将执行 JNDI 查找(因为没有注入):
javax.ejb.SessionBean
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。