7.2. PAX-JMS 구성 서비스 정보
mvn:org.ops4j.pax.jms/pax-jms-config/1.0.0
번들에서는 다음 세 가지 작업을 수행하는 관리형 서비스 Cryostat를 제공합니다.
org.ops4j.pax.jms.service.ConnectionFactoryFactory
OSGi 서비스를 추적하여 해당 메서드를 호출합니다.public ConnectionFactory createConnectionFactory(Map<String, Object> properties); public XAConnectionFactory createXAConnectionFactory(Map<String, Object> properties);
-
위의 방법에 필요한 속성을 수집하기 위해
org.ops4j.connection factory 팩토리 PID
를 추적합니다. 예를 들어${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
)을 지정하는 경우 Artemis JMS 클라이언트 대신 QPID 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-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.13.0.fuse-7_13_0-00012-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 또는 웹 콘솔에서 메시지가 전송되었는지 확인할 수도 있습니다.
7.2.3. Apache Karaf에서 Fuse A-MQ 6.3 Client 사용
Fuse 소프트웨어 다운로드 페이지에서 Fuse 빠른 시작을
다운로드할 수 있습니다.
빠른 시작 zip 파일의 내용을 로컬 폴더(예: quickstarts
라는 폴더 )로 추출합니다.
OSGi 번들로 퀵스타트/camel/camel-jms
예제를 빌드하고 설치할 수 있습니다. 이 번들에는 JBoss A-MQ 6.3 JMS 큐로 메시지를 전송하는 Camel 경로에 대한 블루프린트 XML 정의가 포함되어 있습니다. JBoss A-MQ 6.3 브로커를 위한 연결 팩토리를 생성하는 절차는 다음과 같습니다.
7.2.3.1. 사전 요구 사항
- Maven 3.3.1 이상을 설치했습니다.
- 시스템에 Red Hat Fuse가 설치되어 있어야 합니다.
- 시스템에 JBoss A-MQ Broker 6.3이 설치되어 있어야 합니다.
- 고객 포털에서 Karaf 빠른 시작 zip 파일을 다운로드하여 추출했습니다.
7.2.3.2. 프로세스
-
quickstarts/camel/camel-jms/src/main/resources/OSGI-INF/blueprint/
디렉터리로 이동합니다. camel-context.xml
파일의 id="jms"로 다음 8080을 바꿉니다.<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
빠른 시작이 성공적으로 설치되면
$FUSE_HOME/
디렉터리로 이동하여 다음 명령을 실행하여 Apache Karaf 서버에서 Fuse를 시작합니다.$ ./bin/fuse
Fuse on Apache Karaf 인스턴스에서
activemq-client
기능 및camel-jms
기능을 설치합니다.karaf@root()> feature:install activemq-client karaf@root()> feature:install camel-jms
camel-jms
빠른 시작 번들을 설치합니다.karaf@root()> install -s mvn:org.jboss.fuse.quickstarts/camel-jms/{$fuseversion}
여기서
{$fuseversion}
을 방금 빌드한 Maven 아티팩트의 실제 버전으로 바꿉니다( 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
디렉터리가 표시됩니다. 이 빠른 시작의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. 처리된 속성 요약
구성 관리 팩토리 PID 의 속성은 관련 org.ops4j.pax.jms.service.ConnectionFactoryFactory
구현으로 전달됩니다.
ActiveMQ
org.ops4j.pax.jms.activemq.ActiveMQConnectionFactoryFactory
(JMS 1.1만 해당)org.apache.activemq.ActiveMQConnectionFactory.buildFromMap()
메서드에 전달되는 속성Artemis
org.ops4j.pax.jms.artemis.ArtemisConnectionFactoryFactory
protocol=amqp
인 경우 속성은org.apache.qpid.jms.jms.jms.jms.
메서드로 전달됩니다.jms.JmsConnectionFactory 인스턴스를 구성하기 위해 org.apache.qpid.util.PropertyUtil.
setProperties()그렇지 않으면
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
의 Cryostat 속성이 처리됩니다.