24.10. 配置通用的 JMS 资源适配器以用于第三方的 JMS 供应商
您可以配置 JBoss EAP 6 和第三方的 JMS 供应商一起使用,然而不是所有的 JMS 供应商都为集成 Java 应用程序而编写 JMS JCA 资源适配器。这个过程涵盖了配置 JBoss EAP 6 里包含的通用 JMS 资源适配器来连接 JMS 供应商的步骤。在这个过程里,Tibco EMS 6.3 用作示例 JMS 供应商,其他的 JMS 供应商需要不同的配置。
重要
这个过程假设 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.jarandtibcrypt.jarfrom the Tibco installation's/libdirectory. - 在
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 资源适配器以供使用。
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) {
}
}

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.