7.2. 关于 PAX-JMS 配置服务
mvn:org.ops4j.pax.jms/pax-jms-config/1.0.0
捆绑包提供了一个 Managed Service Factory,它执行三个操作:
跟踪
org.ops4j.pax.jms.service.ConnectionFactoryFactory
OSGi 服务,以调用其方法:public ConnectionFactory createConnectionFactory(Map<String, Object> properties); public XAConnectionFactory createXAConnectionFactory(Map<String, Object> properties);
-
跟踪
org.ops4j.connectionfactory
factory PIDs,以收集以上方法所需的属性。如果您使用可用于 Configuration Admin 服务的任何方法创建 工厂配置,例如,通过创建一个${karaf.etc}/org.ops4j.connectionfactory-artemis.cfg
文件,您可以执行最后一步来公开特定于代理的连接工厂。 -
跟踪
javax.jms.ConnectionFactory
和javax.jms.XAConnectionFactory
服务,将它们嵌套在 JMS 连接工厂内。
详情包括在以下主题中:
7.2.1. 为 AMQ 7.1 创建连接工厂
以下是为 Artemis 代理创建连接因素的详细 规范、逐步指南。
使用
pax-jms-artemis
功能和pax-jms-config
功能安装 Artemis 驱动程序:karaf@root()> feature:install pax-jms-artemis karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-config OPS4J Pax JMS Config (248) provides: ------------------------------------ objectClass = [org.osgi.service.cm.ManagedServiceFactory] service.bundleid = 248 service.id = 328 service.pid = org.ops4j.connectionfactory service.scope = singleton karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-artemis OPS4J Pax JMS Artemis Support (247) provides: --------------------------------------------- objectClass = [org.ops4j.pax.jms.service.ConnectionFactoryFactory] service.bundleid = 247 service.id = 327 service.scope = singleton type = artemis
创建 工厂配置 :
karaf@root()> config:edit --factory --alias artemis org.ops4j.connectionfactory karaf@root()> config:property-set type artemis karaf@root()> config:property-set osgi.jndi.service.name jms/artemis # "name" property may be used too karaf@root()> config:property-set connectionFactoryType ConnectionFactory # or XAConnectionFactory karaf@root()> config:property-set jms.url tcp://localhost:61616 karaf@root()> config:property-set jms.user admin karaf@root()> config:property-set jms.password admin karaf@root()> config:property-set jms.consumerMaxRate 1234 karaf@root()> config:update karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)' ---------------------------------------------------------------- Pid: org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 FactoryPid: org.ops4j.connectionfactory BundleLocation: ? Properties: connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karar.etc}/org.ops4j.connectionfactory-artemis.cfg jms.consumerMaxRate = 1234 jms.password = admin jms.url = tcp://localhost:61616 jms.user = admin osgi.jndi.service.name = jms/artemis service.factoryPid = org.ops4j.connectionfactory service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 type = artemis
检查
pax-jms-config
是否处理到javax.jms.ConnectionFactory
服务中的配置:karaf@root()> service:list javax.jms.ConnectionFactory [javax.jms.ConnectionFactory] ----------------------------- connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-artemis.cfg jms.consumerMaxRate = 1234 jms.password = admin jms.url = tcp://localhost:61616 jms.user = admin osgi.jndi.service.name = jms/artemis pax.jms.managed = true service.bundleid = 248 service.factoryPid = org.ops4j.connectionfactory service.id = 342 service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 service.scope = singleton type = artemis Provided by : OPS4J Pax JMS Config (248)
注意如果您指定了额外的 Artemis 配置,特别是
protocol=amqp
,则将使用 QPID JMS 库而不是 Artemis JMS 客户端。还必须将amqp://
协议用于jms.url
属性。- 测试连接。
现在,您有一个特定于代理(还没有池)的连接工厂,您可以在需要时注入。例如,您可以使用 jms
功能中的 Karaf 命令:
karaf@root()> feature:install -v jms Adding features: jms/[4.2.0.fuse-000237-redhat-1,4.2.0.fuse-000237-redhat-1] ... karaf@root()> jms:connectionfactories JMS Connection Factory ────────────────────── jms/artemis karaf@root()> jms:info -u admin -p admin jms/artemis Property │ Value ─────────┼────────────────────────── product │ ActiveMQ version │ 2.4.0.amq-711002-redhat-1 karaf@root()> jms:send -u admin -p admin jms/artemis DEV.QUEUE.1 "Hello Artemis" karaf@root()> jms:browse -u admin -p admin jms/artemis DEV.QUEUE.1 Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp ────────────────────────────────────────┼───────────────┼─────────┼──────┼────────────────┼───────────────┼────────────────────────────┼────────────┼──────────┼─────────────┼─────────┼────────────────────────────── ID:2b6ea56d-574d-11e8-971a-7ee9ecc029d4 │ Hello Artemis │ UTF-8 │ │ │ Persistent │ ActiveMQQueue[DEV.QUEUE.1] │ Never │ 4 │ false │ │ Mon May 14 10:02:38 CEST 2018
以下列表显示了在切换协议时会发生什么:
karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)' ---------------------------------------------------------------- Pid: org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 FactoryPid: org.ops4j.connectionfactory BundleLocation: ? Properties: connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-artemis.cfg jms.consumerMaxRate = 1234 jms.password = fuse jms.url = tcp://localhost:61616 jms.user = fuse osgi.jndi.service.name = jms/artemis service.factoryPid = org.ops4j.connectionfactory service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 type = artemis karaf@root()> config:edit org.ops4j.connectionfactory.312eb09a-d686-4229-b7e1-2ea38a77bb0f karaf@root()> config:property-set protocol amqp karaf@root()> config:property-delete user karaf@root()> config:property-set username admin # mind the difference between artemis-jms-client and qpid-jms-client karaf@root()> config:property-set jms.url amqp://localhost:61616 karaf@root()> config:update karaf@root()> jms:info -u admin -p admin jms/artemis Property │ Value ─────────┼──────────────── product │ QpidJMS version │ 0.30.0.redhat-1 karaf@root()> jms:browse -u admin -p admin jms/artemis DEV.QUEUE.1 Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp ───────────┼───────────────┼─────────┼──────┼────────────────┼───────────────┼─────────────┼────────────┼──────────┼─────────────┼─────────┼────────────────────────────── │ Hello Artemis │ UTF-8 │ │ │ Persistent │ DEV.QUEUE.1 │ Never │ 4 │ false │ │ Mon May 14 10:02:38 CEST 2018
7.2.2. 为 IBM MQ 8 或 IBM MQ 9 创建连接工厂
本节介绍如何连接到 IBM MQ 8 和 IBM MQ 9。虽然 pax-jms-ibmmq
安装相关的 pax-jms
捆绑包,但由于许可原因,IBM MQ 驱动程序不会被安装。
- 进入 https://developer.ibm.com/messaging/mq-downloads/
- 登录。
- 点您要安装的版本,例如,点 IBM MQ 8.0 Client 或 IBM MQ 9.0 Client。
- 在出现的页面中,在底部,在下载版本表中点击您想要的版本。
-
在下一页中,选择具有
IBM-MQ-Install-Java-All
后缀的最新版本。例如,下载8.0.0.10-WS-MQ-Install-Java-All
或9.0.0.4-IBM-MQ-Install-Java-All
。 - 提取下载的 JAR 文件的内容。
执行
bundle:install
命令。例如,如果您将内容提取到/home/Downloads
目录中,则输入如下命令:`bundle:install -s wrap:file:////home/Downloads/9.0.0.4-IBM-MQ-Install-Java-All/ibmmq9/wmq/JavaSE/com.ibm.mq.allclient.jar`.
按如下所示创建连接工厂:
安装
pax-jms-ibmmq
:karaf@root()> feature:install pax-jms-ibmmq karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-ibmmq OPS4J Pax JMS IBM MQ Support (239) provides: -------------------------------------------- objectClass = [org.ops4j.pax.jms.service.ConnectionFactoryFactory] service.bundleid = 239 service.id = 346 service.scope = singleton type = ibmmq
创建 工厂配置 :
karaf@root()> config:edit --factory --alias ibmmq org.ops4j.connectionfactory karaf@root()> config:property-set type ibmmq karaf@root()> config:property-set osgi.jndi.service.name jms/mq9 # "name" property may be used too karaf@root()> config:property-set connectionFactoryType ConnectionFactory # or XAConnectionFactory karaf@root()> config:property-set jms.queueManager FUSEQM karaf@root()> config:property-set jms.hostName localhost karaf@root()> config:property-set jms.port 1414 karaf@root()> config:property-set jms.transportType 1 # com.ibm.msg.client.wmq.WMQConstants.WMQ_CM_CLIENT karaf@root()> config:property-set jms.channel DEV.APP.SVRCONN karaf@root()> config:property-set jms.CCSID 1208 # com.ibm.msg.client.jms.JmsConstants.CCSID_UTF8 karaf@root()> config:update karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)' ---------------------------------------------------------------- Pid: org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 FactoryPid: org.ops4j.connectionfactory BundleLocation: ? Properties: connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-ibmmq.cfg jms.CCSID = 1208 jms.channel = DEV.APP.SVRCONN jms.hostName = localhost jms.port = 1414 jms.queueManager = FUSEQM jms.transportType = 1 osgi.jndi.service.name = jms/mq9 service.factoryPid = org.ops4j.connectionfactory service.pid = org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 type = ibmmq
检查
pax-jms-config
是否处理到javax.jms.ConnectionFactory
服务中的配置:karaf@root()> service:list javax.jms.ConnectionFactory [javax.jms.ConnectionFactory] ----------------------------- connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:/data/servers/7.12.0.fuse-7_12_0-00019-redhat-00001/etc/org.ops4j.connectionfactory-ibmmq.cfg jms.CCSID = 1208 jms.channel = DEV.APP.SVRCONN jms.hostName = localhost jms.port = 1414 jms.queueManager = FUSEQM jms.transportType = 1 osgi.jndi.service.name = jms/mq9 pax.jms.managed = true service.bundleid = 237 service.factoryPid = org.ops4j.connectionfactory service.id = 347 service.pid = org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 service.scope = singleton type = ibmmq Provided by : OPS4J Pax JMS Config (237)
测试连接:
karaf@root()> feature:install -v jms Adding features: jms/[4.2.0.fuse-000237-redhat-1,4.2.0.fuse-000237-redhat-1] ... karaf@root()> jms:connectionfactories JMS Connection Factory ────────────────────── jms/mq9 karaf@root()> jms:info -u app -p fuse jms/mq9 Property │ Value ─────────┼──────────────────── product │ IBM MQ JMS Provider version │ 8.0.0.0 karaf@root()> jms:send -u app -p fuse jms/mq9 DEV.QUEUE.1 "Hello IBM MQ 9" karaf@root()> jms:browse -u app -p fuse jms/mq9 DEV.QUEUE.1 Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp ────────────────────────────────────────────────────┼─────────────────────────────┼─────────┼──────┼────────────────┼───────────────┼──────────────────────┼────────────┼──────────┼─────────────┼─────────┼────────────────────────────── ID:414d512046555345514d202020202020c940f95a038b3220 │ Hello IBM MQ 9 │ UTF-8 │ │ │ Persistent │ queue:///DEV.QUEUE.1 │ Never │ 4 │ false │ │ Mon May 14 10:17:01 CEST 2018
您还可以检查消息是否从 IBM MQ Explorer 发送或从 Web 控制台发送。
7.2.3. 在 Apache Karaf 上的 Fuse 中使用 JBoss A-MQ 6.3 客户端
您可以从 Fuse Software Downloads 页面下载 Fuse 快速入门
。
将快速启动 zip 文件的内容提取到本地文件夹,例如一个名为 quickstarts
的文件夹。
您可以构建并安装 quickstarts/camel/camel-jms
示例作为 OSGi 捆绑包。此捆绑包包含 Camel 路由的蓝图 XML 定义,用于将消息发送到 JBoss A-MQ 6.3 JMS 队列。为 JBoss A-MQ 6.3 代理创建连接工厂的步骤如下:
7.2.3.1. 先决条件
- 已安装 Maven 3.3.1 或更高版本。
- 您已在机器上安装了 Red Hat Fuse。
- 您已在计算机上安装了 JBoss A-MQ Broker 6.3。
- 您已从客户门户网站下载并解压缩了 Karaf quickstarts zip 文件中的 Fuse。
7.2.3.2. 步骤
-
导航到
quickstarts/camel/camel-jms/src/main/resources/OSGI-INF/blueprint/
目录。 将以下 bean 替换为
camel-context.xml
文件中的 id="jms" :<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory"> <reference interface="javax.jms.ConnectionFactory" /> </property> <property name="transactionManager" ref="transactionManager"/> </bean>
使用以下部分来实例化 JBoss A-MQ 6.3 连接工厂:
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="activemqConnectionFactory"/> <property name="transactionManager" ref="transactionManager"/> </bean> <bean id="activemqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> <property name="userName" value="admin"/> <property name="password" value="admin"/> </bean>
JBoss A-MQ 6.3 连接工厂配置为连接到在
tcp://localhost:61616
侦听的代理。默认情况下,JBoss A-MQ 使用 IP 端口值61616
。连接工厂也配置为使用 userName/password 凭证 admin/admin。确保此用户已在代理协调中启用(或者您可以在此处自定义这些设置以匹配代理配置)。-
保存
camel-context.xml
文件。 构建
camel-jms
快速启动:$ cd quickstarts/camel/camel-jms $ mvn install
成功安装 Quickstart 后,进入到
$FUSE_HOME/
目录,并运行以下命令来在 Apache Karaf 服务器上启动 Fuse:$ ./bin/fuse
在 Apache Karaf 实例的 Fuse 上,安装
activemq-client
功能和camel-jms
功能:karaf@root()> feature:install activemq-client karaf@root()> feature:install camel-jms
安装
camel-jms
quickstart 捆绑包:karaf@root()> install -s mvn:org.jboss.fuse.quickstarts/camel-jms/{$fuseversion}
其中,将
{$fuseversion}
替换为您刚才构建的 Maven 工件的实际版本(consult the camel-jms quickstart README 文件)。启动
JBoss A-MQ 6.3
代理(您需要安装 JBoss A-MQ 6.3)。打开另一个终端窗口,再导航到 JBOSS_AMQ_63_INSTALLDIR 目录:$ cd JBOSS_AMQ_63_INSTALLDIR $ ./bin/amq
-
Camel 路由启动后,您可以在 Fuse 安装中看到目录
work/jms/input
。将您在这个 quickstart 的src/main/data
目录中找到的文件复制到新创建的work/jms/input
目录中。 稍等片刻,您将在
work/jms/output
目录下找到国家按国家组织相同的文件:order1.xml, order2.xml and order4.xml in work/jms/output/others order3.xml and order5.xml in work/jms/output/us order6.xml in work/jms/output/fr
使用
log:display
检查业务日志记录:Receiving order order1.xml Sending order order1.xml to another country Done processing order1.xml
7.2.4. 处理的属性摘要
Configuration Admin factory PID 中的属性传递到相关的 org.ops4j.pax.jms.service.ConnectionFactoryFactory
实现。
ActiveMQ
org.ops4j.pax.jms.activemq.ActiveMQConnectionFactoryFactory
(JMS 1.1 only)传递给
org.apache.activemq.ActiveMQConnectionFactory.buildFromMap ()
方法的属性artemis
org.ops4j.pax.jms.artemis.ArtemisConnectionFactoryFactory
如果
protocol=amqp
,属性将传递到org.apache.qpid.jms.util.util.PropertyUtil.setProperties ()
方法,以配置org.apache.qpid.jms.JmsConnectionFactory
实例。否则,
org.apache.activemq.artemis.utils.uri.BeanSupport.setData ()
为org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory
实例调用。IBM MQ
org.ops4j.pax.jms.ibmmq.MQConnectionFactoryFactory
处理
com.ibm.mq.jms.MQConnectionFactory
或com.ibm.mq.jms.MQXAConnectionFactory
的 bean 属性。