7.6. 연결 팩토리를 아티팩트로 배포


이 주제에서는 실제 권장 사항에 대해 설명합니다.

배포 방법 에서는javax.jms.ConnectionFactory 서비스는 애플리케이션 코드로 직접 등록합니다. 일반적으로 이 코드는 블루프린트 컨테이너 내에 있습니다. 블루프린트 XML은 일반 OSGi 번들의 일부일 수 있으며 mvn: URI를 사용하여 설치하고 Maven 리포지토리(로컬 또는 원격)에 저장할 수 있습니다. 구성 관리 구성에 비해 번들과 같은 버전 제어를 더 쉽게 수행할 수 있습니다.

pax-jms-config 버전 1.0.0 번들은 연결 팩토리 구성을 위한 배포 방법을 추가합니다. 애플리케이션 개발자는 javax.jms.(XA)ConnectionFactory 서비스(일반적으로 Bluerpint XML를 사용하여)를 등록하고 서비스 속성을 지정합니다. 그런 다음 pax-jms-config 는 등록된 브로커별 연결 팩토리를 감지하고 (서비스 속성 사용) 일반 비 브로커별 연결 풀 내에서 서비스를 래핑합니다.

블루프린트 XML을 사용하는 세 가지 배포 방법은 다음과 같습니다.

7.6.1. 연결 팩토리의 수동 배포

이 방법에서는 pax-jms-config 번들이 필요하지 않습니다. 애플리케이션 코드는 브로커별 및 일반 연결 풀을 모두 등록합니다.

<!--
    Broker-specific, non-pooling, non-enlisting javax.jms.XAConnectionFactory
-->
<bean id="artemis" class="org.apache.activemq.artemis.jms.client.ActiveMQXAConnectionFactory">
    <argument value="tcp://localhost:61616" />
    <property name="callTimeout" value="2000" />
    <property name="initialConnectAttempts" value="3" />
</bean>

<!--
    Fuse exports this service from fuse-pax-transx-tm-narayana bundle.
-->
<reference id="tm" interface="javax.transaction.TransactionManager" />

<!--
    Non broker-specific, generic, pooling, enlisting javax.jms.ConnectionFactory
-->
<bean id="pool" class="org.messaginghub.pooled.jms.JmsPoolXAConnectionFactory">
    <property name="connectionFactory" ref="artemis" />
    <property name="transactionManager" ref="tm" />
    <property name="maxConnections" value="10" />
    <property name="idleTimeout" value="10000" />
</bean>

<!--
    Expose connection factory for use by application code (such as Camel, Spring, ...)
-->
<service interface="javax.jms.ConnectionFactory" ref="pool">
    <service-properties>
        <!-- Giving connection factory a name using one of these properties makes identification easier in jms:connectionfactories: -->
        <entry key="osgi.jndi.service.name" value="jms/artemis" />
        <!--<entry key="name" value="jms/artemis" />-->
        <!-- Without any of the above, name will fall back to "service.id" -->
    </service-properties>
</service>

다음은 사용 방법을 보여주는 쉘 명령은 다음과 같습니다.

karaf@root()> feature:install artemis-core-client artemis-jms-client
karaf@root()> install -s mvn:org.apache.commons/commons-pool2/2.5.0
Bundle ID: 244
karaf@root()> install -s mvn:org.messaginghub/pooled-jms/0.3.0
Bundle ID: 245
karaf@root()> install -s blueprint:file://$PQ_HOME/message-brokers/blueprints/artemis-manual.xml
Bundle ID: 246

karaf@root()> bundle:services -p 246

Bundle 246 provides:
--------------------
objectClass = [javax.jms.ConnectionFactory]
osgi.jndi.service.name = jms/artemis
osgi.service.blueprint.compname = pool
service.bundleid = 246
service.id = 340
service.scope = bundle
-----
objectClass = [org.osgi.service.blueprint.container.BlueprintContainer]
osgi.blueprint.container.symbolicname = artemis-manual.xml
osgi.blueprint.container.version = 0.0.0
service.bundleid = 246
service.id = 341
service.scope = singleton

karaf@root()> feature:install jms

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

위 목록에 표시된 것처럼 블루프린트 번은 일반적인 브로커별 연결 풀인 javax.jms.ConnectionFactory 서비스를 내보냅니다. 블루프린트 XML에는 명시적인 <service ref="artemis" > 선언이 없기 때문에 브로커별 javax.jms.XAConnectionFactory 는 OSGi 서비스로 등록되지 않습니다.

7.6.2. 연결 팩토리 배포

이 방법은 pax-jms-config표준 방식으로 사용하는 방법을 보여줍니다. 이는 Fuse 6.x에 권장되는 방법과 약간 다릅니다. 여기서 풀링 구성을 서비스 속성으로 지정해야 했습니다.

블루프린트 XML 예제는 다음과 같습니다.

<!--
    A broker-specific org.ops4j.pax.jms.service.ConnectionFactoryFactory that can create (XA)ConnectionFactory
    using properties. It is registered by pax-jms-* bundles
-->
<reference id="connectionFactoryFactory"
        interface="org.ops4j.pax.jms.service.ConnectionFactoryFactory"
        filter="(type=artemis)" />

<!--
    Non broker-specific org.ops4j.pax.jms.service.PooledConnectionFactoryFactory that can create
    pooled connection factories with the help of org.ops4j.pax.jms.service.ConnectionFactoryFactory

    For example, pax-jms-pool-pooledjms bundle registers org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
    with these properties:
     - pool = pooledjms
     - xa = true|false (both are registered)
-->
<reference id="pooledConnectionFactoryFactory"
        interface="org.ops4j.pax.jms.service.PooledConnectionFactoryFactory"
        filter="(&amp;(pool=pooledjms)(xa=true))" />

<!--
    When using XA connection factories, javax.transaction.TransactionManager service is not needed here.
    It is used internally by xa-aware pooledConnectionFactoryFactory.
-->
<!--<reference id="tm" interface="javax.transaction.TransactionManager" />-->

<!--
    Finally, use both factories to expose the pooled, xa-aware, connection factory.
-->
<bean id="pool" factory-ref="pooledConnectionFactoryFactory" factory-method="create">
    <argument ref="connectionFactoryFactory" />
    <argument>
        <props>
            <!--
                Properties needed by artemis-specific org.ops4j.pax.jms.service.ConnectionFactoryFactory
            -->
            <prop key="jms.url" value="tcp://localhost:61616" />
            <prop key="jms.callTimeout" value="2000" />
            <prop key="jms.initialConnectAttempts" value="3" />
            <!-- Properties needed by pooled-jms-specific org.ops4j.pax.jms.service.PooledConnectionFactoryFactory -->
            <prop key="pool.maxConnections" value="10" />
            <prop key="pool.idleTimeout" value="10000" />
        </props>
    </argument>
</bean>

<!--
    Expose connection factory for use by application code (such as Camel, Spring, ...)
-->
<service interface="javax.jms.ConnectionFactory" ref="pool">
    <service-properties>
        <!-- Giving connection factory a name using one of these properties makes identification easier in jms:connectionfactories: -->
        <entry key="osgi.jndi.service.name" value="jms/artemis" />
        <!--<entry key="name" value="jms/artemis" />-->
        <!-- Without any of the above, name will fall back to "service.id" -->
    </service-properties>
</service>

이전 예제에서는 연결 팩토리 (…​)를 사용하여 연결 팩토리를 생성하는 팩토리 빈을 사용합니다. XA 인식 PooledConnectionFactoryFactory 에서 내부적으로 추적하므로 javax. Cryostat.TransactionManager 서비스에 대한 명시적 참조가 필요하지 않습니다.

Fuse/Karaf 쉘의 예는 다음과 같습니다.

karaf@root()> feature:install jms pax-jms-artemis pax-jms-pool-pooledjms

karaf@root()> install -s blueprint:file://$PQ_HOME/message-brokers/blueprints/artemis-pax-jms-factory-pooledjms.xml
Bundle ID: 253
karaf@root()> bundle:services -p 253

Bundle 253 provides:
--------------------
objectClass = [javax.jms.ConnectionFactory]
osgi.jndi.service.name = jms/artemis
osgi.service.blueprint.compname = pool
service.bundleid = 253
service.id = 347
service.scope = bundle
-----
objectClass = [org.osgi.service.blueprint.container.BlueprintContainer]
osgi.blueprint.container.symbolicname = artemis-pax-jms-factory-pooledjms.xml
osgi.blueprint.container.version = 0.0.0
service.bundleid = 253
service.id = 348
service.scope = singleton

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

위 목록에 표시된 것처럼 블루프린트 번은 일반적인 브로커별 연결 풀인 javax.jms.ConnectionFactory 서비스를 내보냅니다. 블루프린트 XML에는 명시적인 <service ref="artemis" > 선언이 없기 때문에 브로커별 javax.jms.XAConnectionFactory 는 OSGi 서비스로 등록되지 않습니다.

7.6.3. 연결 팩토리의 혼합 배포

pax-jms-config 1.0.0 번에서는 서비스 속성을 사용하여 풀링 연결 팩토리 내의 브로커별 연결 팩토리를 래핑 하는 다른 방법을 추가합니다. 이 방법은 Fuse 6.x에서 작업하는 방식과 일치합니다.

블루프린트 XML 예제는 다음과 같습니다.

<!--
    Broker-specific, non-pooling, non-enlisting javax.jms.XAConnectionFactory
-->
<bean id="artemis" class="org.apache.activemq.artemis.jms.client.ActiveMQXAConnectionFactory">
    <argument value="tcp://localhost:61616" />
    <property name="callTimeout" value="2000" />
    <property name="initialConnectAttempts" value="3" />
</bean>

<!--
    Expose broker-specific connection factory with service properties.
    No need to expose pooling, enlisting, non broker-specific javax.jms.XAConnectionFactory. It will be registered
    automatically by pax-jms-config with the same properties as this <service>, but with a higher service.ranking
-->
<service id="pool" ref="artemis" interface="javax.jms.XAConnectionFactory">
    <service-properties>
        <!-- "pool" key is needed for pax-jms-config to wrap broker-specific connection factory inside connection pool -->
        <entry key="pool" value="pooledjms" />
        <!-- <service>/@id attribute does not propagate, but name of the connection factory is required using one of: -->
        <entry key="osgi.jndi.service.name" value="jms/artemis" />
        <!-- or: -->
        <!--<entry key="name" value="jms/artemis" />-->
        <!-- Other properties, that normally by e.g., pax-jms-pool-pooledjms -->
        <entry key="pool.maxConnections" value="10" />
        <entry key="pool.idleTimeout" value="10000" />
    </service-properties>
</service>

위의 예에서는 브로커별 연결 팩토리의 수동 레지스터만 볼 수 있습니다. pool=pooledjms service 속성은 pax-jms-config 번들에서 관리하는 연결 팩토리 추적기에 대한 힌트입니다. 이 서비스 속성을 사용하는 연결 팩토리 서비스는 풀링 연결 팩토리(이 예에서는 pax-jms-pool-pooledjms ) 내에서 래핑됩니다.

Fuse/Karaf 쉘의 예는 다음과 같습니다.

karaf@root()> feature:install jms pax-jms-config pax-jms-artemis pax-jms-pool-pooledjms

karaf@root()> install -s blueprint:file://$PQ_HOME/message-brokers/blueprints/artemis-pax-jms-discovery.xml
Bundle ID: 254

karaf@root()> bundle:services -p 254

Bundle 254 provides:
--------------------
objectClass = [javax.jms.XAConnectionFactory]
osgi.jndi.service.name = jms/artemis
osgi.service.blueprint.compname = artemis
pool = pooledjms
pool.idleTimeout = 10000
pool.maxConnections = 10
service.bundleid = 254
service.id = 349
service.scope = bundle
-----
objectClass = [org.osgi.service.blueprint.container.BlueprintContainer]
osgi.blueprint.container.symbolicname = artemis-pax-jms-discovery.xml
osgi.blueprint.container.version = 0.0.0
service.bundleid = 254
service.id = 351
service.scope = singleton

karaf@root()> service:list javax.jms.XAConnectionFactory
[javax.jms.XAConnectionFactory]
-------------------------------
 osgi.jndi.service.name = jms/artemis
 osgi.service.blueprint.compname = artemis
 pool = pooledjms
 pool.idleTimeout = 10000
 pool.maxConnections = 10
 service.bundleid = 254
 service.id = 349
 service.scope = bundle
Provided by :
 Bundle 254
Used by:
 OPS4J Pax JMS Config (251)

karaf@root()> service:list javax.jms.ConnectionFactory
[javax.jms.ConnectionFactory]
-----------------------------
 osgi.jndi.service.name = jms/artemis
 osgi.service.blueprint.compname = artemis
 pax.jms.managed = true
 pax.jms.service.id.ref = 349
 pool.idleTimeout = 10000
 pool.maxConnections = 10
 service.bundleid = 251
 service.id = 350
 service.ranking = 1000
 service.scope = singleton
Provided by :
 OPS4J Pax JMS Config (251)

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

이전 예에서 jms:connectionfactories 는 하나의 서비스만 표시합니다. 이 명령은 중복 이름을 제거하기 때문입니다. 데이터 소스의 혼합 배포에 두 가지 서비스가 jdbc:ds-list 에서 제공되었습니다.

javax.jms.XAConnectionFactory 는 블루프린트 번들에서 등록되며, 선언된 pool = pooledjms 속성이 있습니다.

javax.jms.ConnectionFactorypax-jms-config 번들 및에서 등록됩니다.

  • pool = pooledjms 속성이 없습니다. 래퍼 연결 팩토리를 등록할 때 제거되었습니다.
  • service.ranking = 1000 속성이 있으므로 예를 들어 이름으로 연결 팩토리를 찾을 때 기본 설정 버전입니다.
  • pax.jms.managed = true 속성이 있으므로 다시 래핑하려고 시도하지 않습니다.
  • 연결 풀 내에서 래핑된 원래 연결 팩토리 서비스를 나타내는 pax.jms.service.id.ref = 349 속성이 있습니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.