31.7. 部署 Generic Jakarta 消息传递资源适配器
JBoss EAP 可以配置为与第三方 Jakarta 消息传递提供商合作;然而,并非所有 Jakarta 消息传递提供商都生产用于与 Jakarta 应用平台集成的 Jakarta 消息传递器资源适配器。此流程涵盖配置 JBoss EAP 中包含的通用 Jakarta 消息传递资源适配器以连接 Jakarta 消息传递提供商所需的步骤。在此流程中,Tibco EMS 8 用作 Jakarta 消息传递供应商的示例。其他 Jakarta 消息传递提供商可能需要不同的配置。
在使用通用 Jakarta 消息传递资源适配器之前,请检查 Jakarta 消息传递提供商,了解他们自己的资源适配器可用于 JBoss EAP。只有在 Jakarta 消息传递供应商不提供自己的资源适配器时,才应使用通用 Jakarta Messaging Jakarta Connectors 资源适配器。
在配置通用资源适配器前,您需要执行以下操作:
- 您的 Jakarta 消息传递供应商服务器必须已经配置好并可供使用。提供商 Jakarta Messaging 实施所需的任何二进制文件都需要。
您将需要了解下列 Jakarta 消息传递提供商属性的值,才能查找其 Jakarta 消息传递资源,如连接工厂、队列或主题。
-
java.naming.factory.initial -
java.naming.provider.url -
java.naming.factory.url.pkgs
-
在此流程中使用的 XML 示例中,这些参数分别写为 PROVIDER_FACTORY_INITIAL、PROVIDER_URL 和 PROVIDER_CONNECTION_FACTORY。将这些占位符替换为您的环境的 Jakarta 消息传递供应商值。
创建并配置资源适配器模块。
创建 JBoss EAP 模块,其中包含连接和与 Jakarta 消息传递提供商通信所需的所有库。此模块将命名为 org.jboss.genericjms.provider。
-
创建以下目录结构:
EAP_HOME/modules/org/jboss/genericjms/provider/main 将提供商 Jakarta 消息实施所需的二进制文件复制到
EAP_HOME/modules/org/jboss/genericjms/provider/main。注意对于 Tibco EMS,所需的二进制文件是来自 Tibco 安装的
lib目录的.jar。tibjms.jar和 tibcrypt在
EAP_HOME/modules/org/jboss/genericjms/provider/main中创建module.xml文件,以资源形式列出前面步骤中的 JAR 文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令在
ee子系统中添加模块:/subsystem=ee:list-add(name=global-modules, value={"name" => "org.jboss.genericjms.provider", "slot" =>"main"}/subsystem=ee:list-add(name=global-modules, value={"name" => "org.jboss.genericjms.provider", "slot" =>"main"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
创建以下目录结构:
为 Jakarta 消息传递提供商创建和配置 Java 命名和目录接口外部上下文。
Jakarta 消息传递资源(如连接工厂和目的地)在 Jakarta 消息传递提供商中查找。在 JBoss EAP 实例中添加外部上下文,以便对此资源的任何本地查找将自动在远程 Jakarta 消息传递提供程序上查找资源。
注意在此过程中,EAP
_HOME/standalone/configuration/standalone-full.xml用作 JBoss EAP 配置文件。使用管理 CLI 创建外部 Java 命名和目录接口上下文,并包含其配置属性。以下示例中的属性应当替换为正确的值,以连接远程 Jakarta 消息传递提供程序。例如,一些 Jakarta 消息提供商(如 Tibco EMS)不支持 Java 命名和目录接口
查找(Name)方法。在这些情况下,添加org.jboss.as.naming.lookup.by.string属性,值设为 true以解决这个问题。检查适配器文档中有关必要属性及其值的信息。/subsystem=naming/binding="java:global/remoteJMS":add(binding-type=external-context,module=org.jboss.genericjms.provider,class=javax.naming.InitialContext,environment=[java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory,java.naming.provider.url=tcp://<hostname>:7222,org.jboss.as.naming.lookup.by.string=true])
/subsystem=naming/binding="java:global/remoteJMS":add(binding-type=external-context,module=org.jboss.genericjms.provider,class=javax.naming.InitialContext,environment=[java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory,java.naming.provider.url=tcp://<hostname>:7222,org.jboss.as.naming.lookup.by.string=true])Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在正确配置了外部上下文后,将对从
java:global/remoteJMS/起的资源的任何 Java 命名和目录接口查找在远程 Jakarta 消息传递提供商上完成。例如,如果消息驱动型 Bean 为java:global/remoteJMS/Queue1执行 Java 命名和目录接口查找,则外部上下文将连接到远程 Jakarta 消息传递提供程序,并且对Queue1资源执行查询。或者,您也可以在查找 Java 命名和目录接口名称时,无需
使用外部上下文即可向远程服务器发出 Java 命名和目录接口查找。为此,可使用 CLI 创建一个引用external-context的新绑定,如下例所示:/subsystem=naming/binding=java\:\/jms\/queue\/myQueue:add(binding-type=lookup, lookup=java:global/remoteJMS/jms/queue/myQueue)
/subsystem=naming/binding=java\:\/jms\/queue\/myQueue:add(binding-type=lookup, lookup=java:global/remoteJMS/jms/queue/myQueue)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,对
java:/jms/queue/myQueue进行 Java 命名和目录接口查找的应用将定位到远程服务器上名为myQueue的队列。创建通用 Jakarta 消息传递资源适配器。
使用管理 CLI 创建资源适配器
/subsystem=resource-adapters/resource-adapter=generic-ra:add(module=org.jboss.genericjms,transaction-support=XATransaction)
/subsystem=resource-adapters/resource-adapter=generic-ra:add(module=org.jboss.genericjms,transaction-support=XATransaction)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置通用 Jakarta 消息传递资源适配器。
使用管理 CLI 配置资源适配器
的连接定义和其他元素。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置
ejb3子系统中默认的消息驱动型 Bean 池,以使用通用资源适配器。/subsystem=ejb3:write-attribute(name=default-resource-adapter-name, value=generic-ra)
/subsystem=ejb3:write-attribute(name=default-resource-adapter-name, value=generic-ra)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
现在,通用 Jakarta 消息传递资源适配器已被配置并可供使用。以下是在创建新的消息驱动 Bean 时使用资源适配器的示例。
示例:使用通用资源适配器代码
使用通用 Jakarta 消息传递资源适配器时,请确保您将会话设置为被转换,以避免出现潜在的 NullPointerException 错误。发生错误的原因是,当 Jakarta EE 规格指出未被处理它们时,通用 Jakarta 消息传递资源适配器尝试处理参数。这可以通过执行以下操作来实现: connection.createSession(true, Session.SESSION_TRANSACTED);
您还可以使用资源适配器的池连接工厂:
@Resource(lookup = "java:/jms/XAQCF") private ConnectionFactory cf;
@Resource(lookup = "java:/jms/XAQCF")
private ConnectionFactory cf;
无法直接从外部上下文注入资源,但可以注入外部上下文并执行查找。例如,Tibco EMS 代理中部署的队列的查找如下所示:
@Resource(lookup = "java:global/remoteJMS")
private Context context;
...
Queue queue = (Queue) context.lookup("Queue1")
@Resource(lookup = "java:global/remoteJMS")
private Context context;
...
Queue queue = (Queue) context.lookup("Queue1")