7.5. 使用 JMS 连接池
本节讨论 JMS 连接/会话池选项。少于 JDBC 的选择数量要少。这些信息被组织到以下主题:
要使用 XA 恢复,您应该使用 pax-jms-pool-transx
或 pax-jms-pool-narayana
连接池模块。
7.5.1. 使用 JMS 连接池简介
目前,您已注册了一个特定于代理的 连接工厂。由于 连接工厂 本身是连接工厂的工厂,org.ops4j.pax.jms.service.ConnectionFactoryFactory
服务可能会被视为 meta factory。它应该能够生成两种类型的连接工厂:
-
javax.jms.ConnectionFactory
-
javax.jms.XAConnectionFactory
pax-jms-pool busybox
捆绑包与 org.ops4j.pax.jms.service.ConnectionFactoryFactory
服务平稳工作。这些捆绑包提供了 org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
的实现,它们可用于使用一组属性和原始 org.ops4j.pax.jms.service.ConnectionFactoryFactory
来创建池连接工厂。例如:
public interface PooledConnectionFactoryFactory { ConnectionFactory create(ConnectionFactoryFactory cff, Map<String, Object> props); }
下表显示了哪些捆绑包注册池连接工厂。在表中,o.o.p.j.p
代表 org.ops4j.pax.jms.pool
。
捆绑包(Bundle) | PooledConnectionFactoryFactory | 池密钥 |
---|---|---|
|
|
|
|
|
|
|
|
|
pax-jms-pool-narayana
工厂名为 PooledJms (XA) PooledConnectionFactoryFactory
,因为它基于 pooled-jms
库。它为 XA 恢复添加与 Narayana 事务管理器的集成。
以上捆绑包只安装连接工厂。不安装连接工厂的捆绑包。因此,需要一些操作来调用 javax.jms.ConnectionFactory org.ops4j.pax.jms.service.PooledConnectionFactoryFactory.create ()
方法。
7.5.2. 使用 pax-jms-pool-pooledjms 连接池模块
了解如何使用 pax-jms-pool-pooledjms
捆绑包可帮助您仅使用 pax-jms-pool-pooledjms
捆绑包,以及 pax-jms-pool-pool-pool -pool-narayna
捆绑包,几乎执行几乎所有操作为 pax-jms-pool-pooledjms
。
pax-jms-config 捆绑包跟踪以下内容:
-
org.ops4j.pax.jms.service.ConnectionFactoryFactory
services -
org.ops4j.connectionfactory
factory PIDs -
org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
的实例由pax-jms-pool
114 捆绑包之一注册。
如果 工厂配置包含 池
属性,则由 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 可能会包含前缀为 pool
对于 pooled-jms
库,将使用这些前缀属性(在删除前缀后)来配置实例:
-
org.messaginghub.pooled.jms.JmsPoolConnectionFactory
, 或 -
org.messaginghub.pooled.jms.JmsPoolXAConnectionFactory
以下列表是 pooled-jms
池(org.ops4j.connectionfactory-artemis
factory PID)的真实配置,它使用带有 jms.
-prefixed 属性的便捷语法:
# 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 # ...
在上述配置中,池和
xa
键是 提示 (服务过滤器属性)来选择一个注册的 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
以下是创建和配置连接池的步骤的完整示例:
安装所需的功能:
karaf@root()> feature:install -v pax-jms-pool-pooledjms pax-jms-artemis Adding features: pax-jms-pool-pooledjms/[1.0.0,1.0.0] ...
安装
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)
创建 工厂配置 :
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
检查
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.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)
使用连接工厂:
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
。它安装特定于池的 org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
,适用于 XA 和非 XA 场景。唯一的 区别是在 XA 场景中,有一个额外的集成点。org.jboss.tm.XAResourceRecovery
OSGi 服务被注册为由 com.arjuna.ats.arjuna.recovery.RecoveryManager
获取。
7.5.4. 使用 pax-jms-pool-transx 连接池模块
pax-jms-pool-transx
模块提供了 org.ops4j.pax.jms.service.PooledConnectionFactoryFactory
服务的实现,它基于 pax-transx-jms
捆绑包。pax-transx-jms
捆绑包使用 org.ops4j.pax.transx.jms.ManagedConnectionFactoryBuilder
工具来创建 javax.jms.ConnectionFactory
池。这是 第 8.3 节 “关于 pax-transx 项目” 中讨论的 JCA (Java™ Connector Architecture)解决方案。