我正在使用 spring 集成来调用活动 mq 另一端的服务。我的配置看起来像:
<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg>
<bean class="org.apache.activemq.ActiveMQConnectionFactory"
p:brokerURL="${risk.approval.queue.broker}"
p:userName="${risk.approval.queue.username}"
p:password="${risk.approval.queue.password}"
/>
</constructor-arg>
<property name="reconnectOnException" value="true"/>
<property name="sessionCacheSize" value="100"/>
</bean>
<!-- create and close a connection to prepopulate the pool -->
<bean factory-bean="jmsConnectionFactory" factory-method="createConnection" class="javax.jms.Connection"
init-method="close" />
<integration:channel id="riskApprovalRequestChannel"/>
<integration:channel id="riskApprovalResponseChannel"/>
<jms:outbound-gateway id="riskApprovalServiceGateway"
request-destination-name="${risk.approval.queue.request}"
reply-destination-name="${risk.approval.queue.response}"
request-channel="riskApprovalRequestChannel"
reply-channel="riskApprovalResponseChannel"
connection-factory="jmsConnectionFactory"
receive-timeout="5000"/>
<integration:gateway id="riskApprovalService" service-interface="com.my.super.ServiceInterface"
default-request-channel="riskApprovalRequestChannel"
default-reply-channel="riskApprovalResponseChannel"/>
我注意到的是,使用此配置,消费者创建来从活动 mq 获取匹配请求永远不会关闭。每个请求都会增加消费者计数。
我可以通过添加来阻止这种情况发生
<property name="cacheConsumers" value="false" />
到 CachingConnectionFactory。
但是根据 CachingConnectionFactory 的java文档:
请注意,持久订阅者只会被缓存,直到会话句柄的逻辑关闭。
这表明会话永远不会关闭。
这是坏事吗?有没有更好的方法来阻止消费者堆积?
干杯,彼得