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 资源适配器
- 为队列和主题的 JNDI 绑定创建一个
ObjectFactory
实现:- 将下列内容作为模版,用您自己的 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; } } }
- 编译上面的代码,并将生成的类文件保存在
remoteJMSObjectFactory.jar
里。
- 为你的 JBoss EAP 6 实例创建一个
genericjms
模块:- 创建下列目录结构:
EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
- 复制
remoteJMSObjectFactory.jar
文件到EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
。 - 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 aretibjms.jar
andtibcrypt.jar
from the Tibco installation's/lib
directory. - 在
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>
- 通过全局模块的方式将通用 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>
- 用通用的资源适配器替换默认的 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>
- 因为远程对象是必需的,请为您的 JMS 主题和队列添加绑定。在
EAP_HOME/standalone/configuration/standalone-full.xml
里的<subsystem xmlns="urn:jboss:domain:naming:1.3">
下,添加绑定,并按需要替换 PROVIDER_QUEUE 和 PROVIDER_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>
- 在
EAP_HOME/standalone/configuration/standalone-full.xml
里,添加通用资源适配器配置到<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
。用 JMS 供应商的值替换 PROVIDER_CONNECTION_FACTORY、PROVIDER_HOST 和 PROVIDER_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_FACTORY、PROVIDER_HOST 和 PROVIDER_PORT。
作为可选项,下面的例子也通过
user
和 password
属性(按需要替换相应的值)配置了用于 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) { } }