7.5. JMS 연결 풀 사용

이 섹션에서는 JMS 연결/세션 풀링 옵션에 대해 설명합니다. JDBC에 대한 선택 사항보다 적은 선택 사항이 있습니다. 정보는 다음 주제로 구성됩니다.

중요

XA 복구를 사용하려면 pax-jms-pool-transx 또는 pax-jms-pool-narayana 연결 풀 모듈을 사용해야 합니다.

7.5.1. JMS 연결 풀 사용 소개

지금까지 브로커별 연결 팩토리 를 등록했습니다. 연결 팩토리 자체는 연결 팩토리 의 팩토리이기 때문에 org.ops4j.pax.jms.service.ConnectionFactoryFactory 서비스는 메타 팩토리 로 취급될 수 있습니다. 두 종류의 연결 팩토리를 생성할 수 있어야 합니다.

  • javax.jms.ConnectionFactory
  • javax.jms.XAConnectionFactory

pax-jms-pool-* 번들은 org.ops4j.pax.jms.service.ConnectionFactoryFactory 서비스와 원활하게 작동합니다. 이러한 번들은 속성 세트와 원래 org.ops4j.pax.service.ConnectionFactoryfactory를 사용하여 풀링된 연결 팩토리를 생성하는 데 사용할 수 있는 org.ops4j.pax.pax.jms.service.service.service.service.service.Pooled ConnectionFactory factory의 구현을 제공합니다. 예를 들면 다음과 같습니다.

public interface PooledConnectionFactoryFactory {

    ConnectionFactory create(ConnectionFactoryFactory cff, Map<String, Object> props);

}

다음 표에서는 풀링된 연결 팩토리 팩토리 팩토리를 등록하는 번들을 보여줍니다. 표에서 o.o.p.j.porg.ops4j.pax.jms.pool 을 나타냅니다.

번들PooledConnectionFactoryFactory풀 키

pax-jms-pool-pooledjms

o.o.p.j.p.pooledjms.PooledJms(XA)PooledConnectionFactoryFactory

pooledjms

pax-jms-pool-narayana

o.o.p.j.p.narayana.PooledJms(XA)PooledConnectionFactoryFactory

narayana

pax-jms-pool-transx

o.o.p.j.p.transx.Transx(XA)PooledConnectionFactoryFactory

transx

참고

pax-jms-pool-narayana 팩토리를 pooled-jms 라이브러리를 기반으로 하므로 PooledJms(XA)PooledConnectionFactoryFactory 라고 합니다. XA 복구를 위한 Narayana 트랜잭션 관리자와의 통합을 추가합니다.

위의 번들은 연결 팩토리만 설치합니다. 연결 팩토리를 직접 설치하지 않는 번들입니다. 결과적으로 javax.jms.ConnectionFactory org.ops4j.pax.jms.service.PooledConnectionFactoryFactory.create() 메서드를 호출하는 데 필요한 것이 있습니다.

7.5.2. pax-jms-pool-pooledjms 연결 풀 모듈 사용

pax-jms-pooledjms 번들을 사용하는 방법을 이해하면 pax-jms-pool-pooledjms 번들뿐만 아니라 pax-jms-pool-pool - narayna 번들도 사용할 수 있습니다.

pax-jms-config 번들은 다음을 추적합니다.

  • org.ops4j.pax.jms.service.ConnectionFactoryFactory services
  • org.ops4j.connection factory팩토리 PID
  • pax-jms-pool-* 번들 중 하나로 등록된 org.ops4j.pax.jms.service.PooledConnectionFactory factory의 인스턴스입니다.

팩토리 구성에 pool 속성이 포함된 경우 pax-jms-config 번들에 의해 등록된 궁극적인 연결 팩토리는 브로커별 연결 팩토리입니다. pool=pooledjms 인 경우 연결 팩토리는 다음 중 하나로 래핑됩니다.

  • org.messaginghub.pooled.jms.JmsPoolConnectionFactory (xa=false)
  • org.messaginghub.pooled.jms.JmsPoolXAConnectionFactory (xa=true)

pool 속성(및 비xa/xa 연결 팩토리 중 하나를 선택하는 부울 xa 속성 외에도 org.ops4j.connectionfactory factory PID 에는 풀 접두사가 있는 속성이 포함될 수 있습니다. .

pooled-jms 라이브러리의 경우 다음과 같은 접두사가 지정된 속성이 ( 접두사를 제거한 후) 사용하여 인스턴스를 구성합니다.

  • org.messaginghub.pooled.jms.JmsPoolConnectionFactory, or
  • org.messaginghub.pooled.jms.JmsPoolXAConnectionFactory

다음 목록은 jms와 함께 편리한 구문을 사용하는 pooled-jms 풀(org.ops4j.connectionfactory-artemis factory PID)의 비현실적 구성입니다.-prefixed properties:

# configuration for pax-jms-config to choose and configure specific org.ops4j.pax.jms.service.ConnectionFactoryFactory
name = jms/artemis
connectionFactoryType = ConnectionFactory
jms.url = tcp://localhost:61616
jms.user = fuse
jms.password = fuse
# org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory specific coniguration
jms.callTimeout = 12000
# ...

# hints for pax-jms-config to use selected org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
pool = pooledjms
xa = false

# pooled-jms specific configuration of org.messaginghub.pooled.jms.JmsPoolConnectionFactory
pool.idleTimeout = 10
pool.maxConnections = 100
pool.blockIfSessionPoolIsFull = true
# ...

위의 구성에서 poolxa 키는 등록된 org.ops4j.pax.jms.service.PooledConnectionFactoryfactory 서비스 중 하나를 선택하는 힌트 (서비스 필터 속성)입니다. pooled-jms 라이브러리의 경우 다음과 같습니다.

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

karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-pool-pooledjms

OPS4J Pax JMS MessagingHub JMS Pool implementation (252) provides:
------------------------------------------------------------------
objectClass = [org.ops4j.pax.jms.service.PooledConnectionFactoryFactory]
pool = pooledjms
service.bundleid = 252
service.id = 331
service.scope = singleton
xa = false
-----
objectClass = [org.ops4j.pax.jms.service.PooledConnectionFactoryFactory]
pool = pooledjms
service.bundleid = 252
service.id = 335
service.scope = singleton
xa = true

다음은 연결 풀을 생성하고 구성하는 단계의 전체 예입니다.

  1. 필요한 기능을 설치합니다.

    karaf@root()> feature:install -v pax-jms-pool-pooledjms pax-jms-artemis
    Adding features: pax-jms-pool-pooledjms/[1.0.0,1.0.0]
    ...
  2. jms 기능을 설치합니다.

    karaf@root()> feature:install jms
    
    karaf@root()> service:list org.ops4j.pax.jms.service.ConnectionFactoryFactory
    [org.ops4j.pax.jms.service.ConnectionFactoryFactory]
    ----------------------------------------------------
     service.bundleid = 249
     service.id = 327
     service.scope = singleton
     type = artemis
    Provided by :
     OPS4J Pax JMS Artemis Support (249)
    
    karaf@root()> service:list org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
    [org.ops4j.pax.jms.service.PooledConnectionFactoryFactory]
    ----------------------------------------------------------
     pool = pooledjms
     service.bundleid = 251
     service.id = 328
     service.scope = singleton
     xa = false
    Provided by :
     OPS4J Pax JMS MessagingHub JMS Pool implementation (251)
    
    [org.ops4j.pax.jms.service.PooledConnectionFactoryFactory]
    ----------------------------------------------------------
     pool = pooledjms
     service.bundleid = 251
     service.id = 333
     service.scope = singleton
     xa = true
    Provided by :
     OPS4J Pax JMS MessagingHub JMS Pool implementation (251)
  3. 팩토리 구성 을 생성합니다.

    karaf@root()> config:edit --factory --alias artemis org.ops4j.connectionfactory
    karaf@root()> config:property-set connectionFactoryType ConnectionFactory
    karaf@root()> config:property-set osgi.jndi.service.name jms/artemis
    karaf@root()> config:property-set type artemis
    karaf@root()> config:property-set protocol amqp # so we switch to org.apache.qpid.jms.JmsConnectionFactory
    karaf@root()> config:property-set jms.url amqp://localhost:61616
    karaf@root()> config:property-set jms.username admin
    karaf@root()> config:property-set jms.password admin
    karaf@root()> config:property-set pool pooledjms
    karaf@root()> config:property-set xa false
    karaf@root()> config:property-set pool.idleTimeout 10
    karaf@root()> config:property-set pool.maxConnections 123
    karaf@root()> config:property-set pool.blockIfSessionPoolIsFull true
    karaf@root()> config:update
  4. pax-jms-configjavax.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.password = admin
     jms.url = amqp://localhost:61616
     jms.username = admin
     osgi.jndi.service.name = jms/artemis
     pax.jms.managed = true
     pool.blockIfSessionPoolIsFull = true
     pool.idleTimeout = 10
     pool.maxConnections = 123
     protocol = amqp
     service.bundleid = 250
     service.factoryPid = org.ops4j.connectionfactory
     service.id = 347
     service.pid = org.ops4j.connectionfactory.fc1b9e85-91b4-421b-aa16-1151b0f836f9
     service.scope = singleton
     type = artemis
    Provided by :
     OPS4J Pax JMS Config (250)
  5. 연결 팩토리를 사용합니다.

    karaf@root()> jms:connectionfactories
    JMS Connection Factory
    ──────────────────────
    jms/artemis
    
    karaf@root()> jms:info -u admin -p admin jms/artemis
    Property │ Value
    ─────────┼────────────────
    product  │ QpidJMS
    version  │ 0.30.0.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:64842f99-5cb2-4850-9e88-f50506d49d20:1:1:1-1 │ Hello Artemis │ UTF-8   │      │                │ Persistent    │ DEV.QUEUE.1 │ Never      │ 4        │ false       │         │ Mon May 14 12:47:13 CEST 2018

7.5.3. pax-jms-pool-narayana 연결 풀 모듈 사용

pax-jms-pool-narayna 모듈은 pax-jms-pool-pooledjms 로 거의 모든 작업을 수행합니다. XA 및 비 XA 시나리오에 대해 pooled-jms-specific org.ops4j.pax.jms.service.PooledConnectionFactoryFactory 를 설치합니다. 유일한 차이점은 XA 시나리오에서는 추가 통합 포인트가 있다는 것입니다. org.jboss.tm.XAResourceRecovery OSGi 서비스는 com.arjuna.ats.arjuna.recovery.Recovery.RecoveryManager 에서 선택할 수 있도록 등록되었습니다.

7.5.4. pax-jms-pool-transx 연결 풀 모듈 사용

pax-jms-pool-transx 모듈은 pax-transx-jms 번들을 기반으로 하는 org.ops4j.pax.service.PooledConnectionFactoryFactory 서비스의 구현을 제공합니다. pax-transx-jms 번들은 org.ops4j.pax.transx.jms.ManagedConnectionFactoryBuilder 기능을 사용하여 javax.jms.ConnectionFactory 풀을 생성합니다. 이는 8.3절. “pax-transx 프로젝트 정보” 에서 설명하는 JCA(Java™ Connector Architecture) 솔루션입니다.