3.2.7.2. 配置 JMS 桥以移植现有的 JMS 消息到到 JBoss EAP 6


JBoss EAP 6 将 JBoss Messaging 替换为 HornetQ 以作为默认的 JMS 实现。从一个环境移植 JMS 消息到另外一个环境的最简单的方法是使用 JMS 桥。JMS 桥的功能是从源 JMS 目的地消费消息并发送到目标 JMS 目的地。你可以配置和部署 JMS 桥到 JBoss EAP 5.x 或 JBoss EAP 6.1 服务器及更高版本里。下面的过程描述如何实现这一点。

过程 3.19. 配置部署到 JBoss EAP 5.x 服务器上的 JMS 桥

为了避免版本间类的冲突,你必须使用下列过程在 JBoss EAP 5.x 里配置 JMS 桥。SAR 目录和桥的名称可以是任意的,也可以进行修改。
  1. 在 JBoss EAP 5 的 deploy 目录里创建一个子目录来包含 SAR,如EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar
  2. EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/ 里创建一个名为 META-INF 的子目录。
  3. EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/ 目录里创建一个包含类似于下列信息的 jboss-service.xml 文件。
    <server>
       <loader-repository>
          com.example:archive=unique-archive-name
          <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
       </loader-repository> 
    
       <!-- JBoss EAP 6 JMS Provider --> 
       <mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider">
          <attribute name="ProviderName">EnterpriseApplicationPlatform6JMSProvider</attribute>
          <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
          <attribute name="FactoryRef">jms/RemoteConnectionFactory</attribute> 
          <attribute name="QueueFactoryRef">jms/RemoteConnectionFactory</attribute>  
          <attribute name="TopicFactoryRef">jms/RemoteConnectionFactory</attribute>      
          <attribute name="Properties">
             java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
             java.naming.provider.url=remote://EnterpriseApplicationPlatform6host:4447
             java.naming.security.principal=jbossuser
             java.naming.security.credentials=jbosspass
          </attribute>
       </mbean> 
    
       <mbean code="org.jboss.jms.server.bridge.BridgeService" name="jboss.jms:service=Bridge,name=MyBridgeName" xmbean-dd="xmdesc/Bridge-xmbean.xml">      
          <depends optional-attribute-name="SourceProviderLoader">jboss.messaging:service=JMSProviderLoader,name=JMSProvider</depends>          
          <depends optional-attribute-name="TargetProviderLoader">jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider</depends>          
          <attribute name="SourceDestinationLookup">/queue/A</attribute>      
          <attribute name="TargetDestinationLookup">jms/queue/test</attribute>       
          <attribute name="QualityOfServiceMode">1</attribute>           
          <attribute name="MaxBatchSize">1</attribute>      
          <attribute name="MaxBatchTime">-1</attribute>           
          <attribute name="FailureRetryInterval">60000</attribute>      
          <attribute name="MaxRetries">-1</attribute>      
          <attribute name="AddMessageIDInHeader">false</attribute>
          <attribute name="TargetUsername">jbossuser</attribute>
          <attribute name="TargetPassword">jbosspass</attribute>
       </mbean>
    </server>
            
    
    
    Copy to Clipboard Toggle word wrap

    注意

    使用 <load-repository> 是为了确保 SAR 具有独立的类加载器。请注意,JNDI 查找和桥 "target" 都包括用户 "jbossuser"(密码 "jbosspass")的安全性凭证。这是因为 JBoss EAP 6 默认是设置了安全性的。用户 "jbossuser" 和密码 "jbosspass" 都是在具有 guest 角色的 ApplicationRealm 里使用 EAP_HOME/bin/add_user.sh 脚本创建的。
  4. 将下列 JAR 从 EAP_HOME/modules/system/layers/base/ 目录复制到 EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/ 目录。用实际的版本号替换每个 VERSION_NUMBER
    • org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
    • org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
    • org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
    • org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
    • org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
    • org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
    • org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
    • org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
    • org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
    • org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
    • org/jboss/netty/main/netty-VERSION_NUMBER.jar
    • org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
    • org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
    • org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar

    注意

    请不要简单地复制 EAP_HOME/bin/client/jboss-client.jar,因为 javax API 类会和 JBoss EAP 5.x 里的类相冲突。

过程 3.20. 配置部署到 JBoss EAP 6.x 服务器上的 JMS 桥

在 JBoss EAP 6.1 以后的版本里,JMS 桥可以用于从任何兼容 JMS 1.1 的服务器上桥接消息。因为源和目标 JMS 资源是用 JNDI 进行查找的,源消息供应商或消息中介的 JNDI 查找类必须捆绑在 JBoss 模块里。下面的过程使用了虚拟的 'MyCustomMQ' 消息中介作为例子。
  1. 为消息供应商创建 JBoss 模块。
    1. EAP_HOME/modules/system/layers/base/ 下为新的模块创建一个目录结构。main/ 子目录将包含客户 JAR 和 module.xml 文件。下面是为消息供应商 MyCustomMQ 创建的一个目录结构示例:EAP_HOME/modules/system/layers/base/org/mycustommq/main/
    2. main/ 子目录里,创建一个包含消息供应商的模块定义的 module.xml 文件。下面是为消息供应商 MyCustomMQ 创建的 module.xml 示例。
      <?xml version="1.0" encoding="UTF-8"?>
      <module xmlns="urn:jboss:module:1.1" name="org.mycustommq">
          <properties>
              <property name="jboss.api" value="private"/>
          </properties> 
      
          <resources>
              <!-- Insert resources required to connect to the source or target   -->
              <resource-root path="mycustommq-1.2.3.jar" />
              <resource-root path="mylogapi-0.0.1.jar" />
          </resources> 
      
          <dependencies>
             <!-- Add the dependencies required by JMS Bridge code                 -->
             <module name="javax.api" />
             <module name="javax.jms.api" />
             <module name="javax.transaction.api"/>
             <!-- Add a dependency on the org.hornetq module since we send         -->
             <!-- messages tothe HornetQ server embedded in the local EAP instance -->
             <module name="org.hornetq" />
          </dependencies>
      </module>
      
      
      Copy to Clipboard Toggle word wrap
    3. 从源资源复制消息供应商用于 JNDI 查找的的 JAR 到模块的 main/ 子目录。MyCustomMQ 模块的目录结构应该类似于:
      modules/
      `-- system
          `-- layers
              `-- base
                  `-- org
                        `-- mycustommq
                            `-- main
                                |-- mycustommq-1.2.3.jar
                                |-- mylogapi-0.0.1.jar
                                |-- module.xml
      
      Copy to Clipboard Toggle word wrap
  2. 配置部署到 JBoss EAP 6 服务器的 messaging 子系统的 JMS 桥。
    1. 在开始之前,请先停止服务器并备份当前的服务器配置文件。如果是作为独立服务器运行,它是 EAP_HOME/standalone/configuration/standalone-full-ha.xml。如果是运行的受管域,请备份 EAP_HOME/domain/configuration/domain.xml 以及 EAP_HOME/domain/configuration/host.xml
    2. 在服务器配置文件里的 messaging 子系统里添加 <jms-bridge> 元素。<source><target> 元素提供的用于 JNDI 查找的 JMS 资源的名称。如果指定了 <user><password> 凭证,当创建 JMS 连接时它们会作为参数传入。
      下面是一个为消息供应商 MyCustomMQ 配置的 <jms-bridge> 元素例子:
      <subsystem xmlns="urn:jboss:domain:messaging:1.3">
         ...
         <jms-bridge name="myBridge" module="org.mycustommq">
            <source>
               <connection-factory name="ConnectionFactory"/>
               <destination name="sourceQ"/>
               <user>user1</user>
               <password>pwd1</password>
               <context>
                  <property key="java.naming.factory.initial" value="org.mycustommq.jndi.MyCustomMQInitialContextFactory"/>
                  <property key="java.naming.provider.url"    value="tcp://127.0.0.1:9292"/>
               </context>
            </source>
            <target>
               <connection-factory name="java:/ConnectionFactory"/>
               <destination name="/jms/targetQ"/>
            </target>
            <quality-of-service>DUPLICATES_OK</quality-of-service>
            <failure-retry-interval>500</failure-retry-interval>
            <max-retries>1</max-retries>
            <max-batch-size>500</max-batch-size>
            <max-batch-time>500</max-batch-time>
            <add-messageID-in-header>true</add-messageID-in-header>
         </jms-bridge>
      </subsystem>
      
      
      Copy to Clipboard Toggle word wrap
      在上面的例子里,JNDI 属性是在 <source><context> 元素里定义的。如上面的 <target> 例子,如果忽略了 <context> 元素,JMS 资源将在本地实例里进行查找。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat