【发布时间】:2021-04-21 19:26:21
【问题描述】:
我以这种方式创建消息处理程序:
@JmsListeners(
JmsListener(destination = "queue1"),
JmsListener(destination = "queue2"),
JmsListener(destination = "queue3"),
JmsListener(destination = "queue4")
)
fun handleMessage(message: String) {
// handle a message
}
当我检查我的消息代理时,我看到我的应用已建立 4 个连接。 不幸的是,我对来自 MQ 管理员的连接数量有限制,所以我希望消息处理程序只使用 1 个连接。
在检查了 Spring Jms 内部之后,我发现 DefaultMessageListenerContainer has an ability to use a shared connection。但问题是Spring的DefaultMessageListenerContainerFactory为每个@JmsListener创建了一个单独的DefaultMessageListenerContainer。
同时,JMS API 允许从单个JMSContext 创建多个JMSConsumers,例如
val jmsContext = connectionFactory.createContext(Session.SESSION_TRANSACTED)
val consumer1 = jmsContext.createConsumer(jmsContext.createQueue("queue1"))
val consumer2 = jmsContext.createConsumer(jmsContext.createQueue("queue2"))
如何设置JmsListeners 以共享公共连接?如果这不可能,Spring 有合理的理由吗?
【问题讨论】:
-
你认为
SingleConnectionFactory做了什么... -
什么版本的 MQ jar 文件?队列管理器
SVRCONN通道上的SHARECNV设置为什么? -
SHARECNV 不会更改连接数,只会更改用于这些连接的 TCP 套接字数。但是您还必须记住,JMS 连接与 MQ 连接不同——简单地说,每个 JMS 连接和每个 JMS 会话都对应一个单独的 MQ 连接。因此,一个典型的 JMS 应用程序(1 个连接 + 1 个会话)将使用 2 个 MQ 连接。然后在调整 qmgr 大小时必须考虑到这一点。
-
我用
maxConnections == 1将MQConnectionFactory包裹在JmsPoolConnectionFactory中。所以只有 1 个MQConnection实例。在调试器中,我还检查了MQConnectionFactory.createConnection()和MQConnection.createSession()分别调用了一次。
标签: spring spring-boot ibm-mq spring-jms spring-messaging