apache-camel - PooledConnectionFactory - 会话已经关闭
问题描述
我遇到一个异常,并在使用 org.apache.activemq.pool.PooledConnectionFactory 向 AMQ 队列生成消息时看到以下记录 -
Caused by: java.lang.IllegalStateException: The session has already been closed
at org.apache.activemq.jms.pool.PooledSession.safeGetSessionHolder(PooledSession.java:482) ~[activemq-jms-pool-5.14.3.jar:5.14.3]
at org.apache.activemq.jms.pool.PooledSession.getInternalSession(PooledSession.java:382) ~[activemq-jms-pool-5.14.3.jar:5.14.3]
at org.apache.activemq.jms.pool.PooledSession.createQueue(PooledSession.java:197) ~[activemq-jms-pool-5.14.3.jar:5.14.3]
它还显示为:
Caused by: javax.jms.IllegalStateException: The Session is closed
at org.apache.activemq.ActiveMQSession.checkClosed(ActiveMQSession.java:771) ~[activemq-client-5.14.3.jar:5.14.3]
at org.apache.activemq.ActiveMQSession.createQueue(ActiveMQSession.java:1329) ~[activemq-client-5.14.3.jar:5.14.3]
at org.apache.activemq.jms.pool.PooledSession.createQueue(PooledSession.java:197) ~[activemq-jms-pool-5.14.3.jar:5.14.3]
需要注意的几点:参数 timeBetweenExpirationCheckMillis 是最近添加到 bean 中的,并且仅在此更改之后才开始显示异常。我的代码为所有消费者和生产者使用相同的连接池。对于 AMQ 交互,我还在几个地方使用了并发消费者。
连接和池的bean如下:
<bean id="jmsPooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop" >
<property name="maxConnections" value="40" />
<property name="connectionFactory" ref="smiConnectionFactory" />
<property name="timeBetweenExpirationCheckMillis" value="300000" />
</bean>
<bean id="smiConnectionFactory" class="org.apache.activemq.ActiveMQSslConnectionFactory">
<property name="brokerURL" value="<ssl_protocol_broker>" />
<property name="userName" value="***********" />
<property name="password" value="***********" />
<property name="trustStore" value="************"/>
<property name="trustStorePassword" value="***********" />
<property name="keyStore" value="***********"/>
<property name="keyStorePassword" value="***********" />
<property name="optimizeAcknowledge" value="true" />
<property name="dispatchAsync" value="true" />
<property name="alwaysSessionAsync" value="true" />
<property name="useAsyncSend" value="true" />
<property name="watchTopicAdvisories" value="false" />
<property name="prefetchPolicy" ref="prefetchPolicy" />
</bean>
<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
<property name="durableTopicPrefetch" value="2000" />
<property name="topicPrefetch" value="32766" />
<property name="queuePrefetch" value="0" />
</bean>
**UPDATE 1:**
Active MQ version : 5.14.5
解决方案
推荐阅读
- docker - Dockerfile 使用 npm 缓存
- rest - 在 REST URI 中使用冒号而不是斜杠
- c# - 使用 Azure AD 的用户名和密码进行本地 ADFS 身份验证 (SharePoint-Online)
- c++ - 在循环内将结构变量插入到 c++ 向量中
- amazon-web-services - 如何根据日期获取条目?
- java - 调用 shutdownNow 后 ScheduledExecutorService 停止可运行
- sql-server - SSIS - 如何从 SSIS 中的文件中传递良好的记录,而不是由于记录不良而使包失败
- javascript - 尝试为测试呈现反应组件时出错
- javascript - React 中的 reducer 有问题
- php - Laravel apis 无法在 https 上运行并给出错误 NET::ERR_CERT_COMMON_NAME_INVALID