使用 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@Resoruceresource-refresource-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.MessageDrivenBeanjavax.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");