使用 ejb 中的资源适配器将 Solace 与 websphere liberty 集成 2.X
Integrating Solace with websphere liberty using Resource adapter in ejb 2.X
我正在使用 ejb 2.x 与 WebSphere Liberty 进行 solace 集成,因为该项目是基于 ejb 2.X 编写的。我找到了很多将安慰资源适配器与 ejb 3 一起使用的示例,但找不到任何使用 ejb 2.x.
的示例
有人可以在这里帮助我使用 ejb 2 配置 solace 资源适配器(即在 ejb-jar.xml、ibm-ejb-jar-bnd.xmi、server.xml 文件中配置)在 WAS 自由中。
由于 EJB 3.x 继续支持所有 EJB 2.x API,因此升级您的应用程序可能并不困难。在 ejb-jar.xml
中,您只需将文件的顶部从 2.x 更新为 3.x,其他一切保持不变。如果您在 ibm-ejb-jar-bnd.xmi
and/or 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
转换为 ejb-local-ref
和 @Resoruce
到 resource-ref
和 resource-env-ref
。最后,执行这些引用的 JNDI 查找代替注入。
由于如果您不使用原始工具修改现有的 EJB 2.x 应用程序可能会很棘手,因此我提供了以下关键的配置部分,以说明 Solace EJB 3.x 示例的内容看起来像 EJB 2.x:
首先,server.xml
中的所有内容都将保持不变。
其次,Solace 示例中两个 bean 的 ejb-jar.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 示例注释已映射到它们的 XML 等效项,然后添加了 ProducerHome
接口。 EJB 3.x 示例不提供 Producer
接口,但显示它被注入到 MDB 中;无接口视图可能是有意的,但 EJB 2.x.
需要 Producer
接口
请注意 ejb-jar.xml
中的 id
值对于 EJB 2.x 很重要,因为它们用于 link 元素以及 [=14] 中的对应元素=].
第三,需要 ibm-ejb-jar-bnd.xmi
文件来绑定对 server.xml 中声明的资源的引用,它看起来像这样:
<?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>
语法比 EJB 3.x 示例中较新的 ibm-ejb-jar-bnd.xml
稍微复杂一点,但基本上它是将 XML 中声明的引用映射到server.xml
中的资源,而 EJB 3.x 示例将通过注释声明的引用映射到 server.xml
中资源的 jndi 名称
最后,来自 EJB 3.x 的代码与 EJB 2.x 实现非常相似,除了 bean 需要实现 javax.ejb.MessageDrivenBean
和 javax.ejb.SessionBean
等. 然后,在 ejbCreate()
方法中,他们将执行 JNDI 查找(因为没有注入):
sbHome = (ProducerHome)new InitialContext().lookup("java:comp/env/ejb/Producer");
sb = sbHome.create();
myCF = (ConnectionFactory)new InitialContext().lookup("java:comp/env/myCF");
myReplyQueue = (Queue)new InitialContext().lookup("java:comp/env/myReplyQueue");
我正在使用 ejb 2.x 与 WebSphere Liberty 进行 solace 集成,因为该项目是基于 ejb 2.X 编写的。我找到了很多将安慰资源适配器与 ejb 3 一起使用的示例,但找不到任何使用 ejb 2.x.
的示例有人可以在这里帮助我使用 ejb 2 配置 solace 资源适配器(即在 ejb-jar.xml、ibm-ejb-jar-bnd.xmi、server.xml 文件中配置)在 WAS 自由中。
由于 EJB 3.x 继续支持所有 EJB 2.x API,因此升级您的应用程序可能并不困难。在 ejb-jar.xml
中,您只需将文件的顶部从 2.x 更新为 3.x,其他一切保持不变。如果您在 ibm-ejb-jar-bnd.xmi
and/or 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
转换为 ejb-local-ref
和 @Resoruce
到 resource-ref
和 resource-env-ref
。最后,执行这些引用的 JNDI 查找代替注入。
由于如果您不使用原始工具修改现有的 EJB 2.x 应用程序可能会很棘手,因此我提供了以下关键的配置部分,以说明 Solace EJB 3.x 示例的内容看起来像 EJB 2.x:
首先,server.xml
中的所有内容都将保持不变。
其次,Solace 示例中两个 bean 的 ejb-jar.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 示例注释已映射到它们的 XML 等效项,然后添加了 ProducerHome
接口。 EJB 3.x 示例不提供 Producer
接口,但显示它被注入到 MDB 中;无接口视图可能是有意的,但 EJB 2.x.
Producer
接口
请注意 ejb-jar.xml
中的 id
值对于 EJB 2.x 很重要,因为它们用于 link 元素以及 [=14] 中的对应元素=].
第三,需要 ibm-ejb-jar-bnd.xmi
文件来绑定对 server.xml 中声明的资源的引用,它看起来像这样:
<?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>
语法比 EJB 3.x 示例中较新的 ibm-ejb-jar-bnd.xml
稍微复杂一点,但基本上它是将 XML 中声明的引用映射到server.xml
中的资源,而 EJB 3.x 示例将通过注释声明的引用映射到 server.xml
最后,来自 EJB 3.x 的代码与 EJB 2.x 实现非常相似,除了 bean 需要实现 javax.ejb.MessageDrivenBean
和 javax.ejb.SessionBean
等. 然后,在 ejbCreate()
方法中,他们将执行 JNDI 查找(因为没有注入):
sbHome = (ProducerHome)new InitialContext().lookup("java:comp/env/ejb/Producer");
sb = sbHome.create();
myCF = (ConnectionFactory)new InitialContext().lookup("java:comp/env/myCF");
myReplyQueue = (Queue)new InitialContext().lookup("java:comp/env/myReplyQueue");