24.10. 配置通用的 JMS 资源适配器以用于第三方的 JMS 供应商

概述

您可以配置 JBoss EAP 6 和第三方的 JMS 供应商一起使用,然而不是所有的 JMS 供应商都为集成 Java 应用程序而编写 JMS JCA 资源适配器。这个过程涵盖了配置 JBoss EAP 6 里包含的通用 JMS 资源适配器来连接 JMS 供应商的步骤。在这个过程里,Tibco EMS 6.3 用作示例 JMS 供应商,其他的 JMS 供应商需要不同的配置。

重要

通用 JMS JCA 资源适配器只应该在 JMS 供应商没有提供自己的资源适配器时才使用。在使用通用 JMS 资源适配器之前,您应该首先检查 JMS 供应商是否有可用于 JBoss EAP 6 的自己的资源适配器。
必须具备的条件

这个过程假设 JMS 供应商服务器已配置好并已准备好运行。您需要准备这个供应商的 JMS 实现所需的任何二进制文件。您也需要知道下列 JMS 供应商属性的值:

  • PROVIDER_HOST:PROVIDER_PORT:JMS 供应商服务器的主机名和端口号。
  • PROVIDER_CONNECTION_FACTORY:部署在 JMS 供应商服务器上的连接工厂的名称。它必须为 XA。
  • PROVIDER_QUEUE, PROVIDER_TOPIC:要使用的 JMS 供应商服务器的队列和主题的名称。

过程 24.10. 配置通用 JMS 资源适配器

  1. 为队列和主题的 JNDI 绑定创建一个 ObjectFactory 实现:
    1. 将下列内容作为模版,用您自己的 JMS 供应商服务器的值替换服务器细节。
      import java.util.Hashtable;
      import java.util.Properties;
       
      public class RemoteJMSObjectFactory implements ObjectFactory {
       
        private Context context = null;
       
        public RemoteJMSObjectFactory() {
        }
       
        public Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable<?, ?> environment) throws Exception {
          try {
            String jndi = (String) obj;
       
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
            env.put(Context.URL_PKG_PREFIXES, "com.tibco.tibjms.naming");
            env.put(Context.PROVIDER_URL, "tcp://TIBCO_HOST:TIBCO_PORT");
       
            context = new InitialContext(env);
            Object o = context.lookup(jndi);
       
            return o;
          } catch (NamingException e) {
            e.printStackTrace();
            throw e;
          }
        }
      }
      
    2. 编译上面的代码,并将生成的类文件保存在 remoteJMSObjectFactory.jar 里。
  2. 为你的 JBoss EAP 6 实例创建一个 genericjms 模块:
    1. 创建下列目录结构:EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
    2. 复制 remoteJMSObjectFactory.jar 文件到 EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
    3. Copy the binaries required for the provider's JMS implementation to EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main. For Tibco EMS, the binaries required are tibjms.jar and tibcrypt.jar from the Tibco installation's /lib directory.
    4. EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main 里创建一个 module.xml 文件,将之前步骤里的 JAR 文件列为资源:
      <module xmlns="urn:jboss:module:1.1" name="org.jboss.genericjms.provider"> 
        <resources> 
            <resource-root path="tibjms.jar"/> 
            <resource-root path="tibcrypt.jar"/>
            <resource-root path="remoteJMSObjectFactory.jar"/>
        </resources> 
      
         <dependencies> 
            <module name="javax.api"/> 
            <module name="javax.jms.api"/> 
        </dependencies> 
      </module>
      
  3. 通过全局模块的方式将通用 JMS 模块添加为所有部署的依赖关系。

    注意

    在这个过程里,EAP_HOME/standalone/configuration/standalone-full.xml 被用作 JBoss EAP 6 配置文件。
    EAP_HOME/standalone/configuration/standalone-full.xml<subsystem xmlns="urn:jboss:domain:ee:1.1"> 下添加:
    <global-modules>
      <module name="org.jboss.genericjms.provider" slot="main"/>
      <module name="org.jboss.common-core" slot="main"/>
    </global-modules>
    
  4. 用通用的资源适配器替换默认的 HornetQ 资源适配器。
    EAP_HOME/standalone/configuration/standalone-full.xml 里,下列内容替换 <subsystem xmlns="urn:jboss:domain:ejb3:1.4"> <mdb>
    <mdb>
      <resource-adapter-ref resource-adapter-name="org.jboss.genericjms"/>
      <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
    </mdb>
    
  5. 因为远程对象是必需的,请为您的 JMS 主题和队列添加绑定。
    EAP_HOME/standalone/configuration/standalone-full.xml 里的 <subsystem xmlns="urn:jboss:domain:naming:1.3"> 下,添加绑定,并按需要替换 PROVIDER_QUEUEPROVIDER_TOPIC
    <bindings>
      <object-factory name="PROVIDER_QUEUE" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
      <object-factory name="PROVIDER_TOPIC" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
    </bindings>
    
  6. EAP_HOME/standalone/configuration/standalone-full.xml 里,添加通用资源适配器配置到 <subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
    用 JMS 供应商的值替换 PROVIDER_CONNECTION_FACTORYPROVIDER_HOSTPROVIDER_PORT
    <resource-adapters>
      <resource-adapter id="org.jboss.genericjms">
        <module slot="main" id="org.jboss.genericjms"/>
        <transaction-support>NoTransaction</transaction-support>
        <connection-definitions>
          <connection-definition class-name="org.jboss.resource.adapter.jms.JmsManagedConnectionFactory" jndi-name="java:/jms/PROVIDER_CONNECTION_FACTORY" pool-name="PROVIDER_CONNECTION_FACTORY">
            <config-property name="JndiParameters">
              java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT
            </config-property>
            <config-property name="ConnectionFactory">
              PROVIDER_CONNECTION_FACTORY
            </config-property>
            <security>
              <application/>
            </security>
          </connection-definition>
        </connection-definitions>
      </resource-adapter>
    </resource-adapters>
    
结果

配置了通用的 JMS 资源适配器以供使用。

当创建新的 Message Driven Bean(MDB)时,请用类似下面的代码来使用资源适配器。用 JMS 供应商的值来替换 PROVIDER_CONNECTION_FACTORYPROVIDER_HOSTPROVIDER_PORT
作为可选项,下面的例子也通过 userpassword 属性(按需要替换相应的值)配置了用于 Tibco EMS 的安全连接。
@MessageDriven(activationConfig = { 
  @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
  @ActivationConfigProperty(propertyName = "jndiParameters", propertyValue = "java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT")
  @ActivationConfigProperty(propertyName = "destination", propertyValue = "PROVIDER_QUEUE"), 
  @ActivationConfigProperty(propertyName = "connectionFactory", propertyValue = "PROVIDER_CONNECTION_FACTORY"),
  @ActivationConfigProperty(propertyName = "user", propertyValue = "USER"),
  @ActivationConfigProperty(propertyName = "password", propertyValue = "PASSWORD"),
})

@ResourceAdapter("org.jboss.genericjms")
public class SampleMdb implements MessageListener { 
  @Override

    public void onMessage(Message message) { 
    
    } 

}