Java 什么';使用spring集成确保关闭jms消费者的正确方法是什么?
我正在使用spring集成来调用活动mq另一端的服务。我的配置看起来像:Java 什么';使用spring集成确保关闭jms消费者的正确方法是什么?,java,jms,spring-integration,Java,Jms,Spring Integration,我正在使用spring集成来调用活动mq另一端的服务。我的配置看起来像: <bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <constructor-arg> <bean class="org.apache.activemq.ActiveMQConnectionFactory"
<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文档:
请注意,持久订阅者将只缓存到逻辑
关闭会话句柄
这意味着会议永远不会结束
这是件坏事吗?有没有更好的办法阻止消费者囤积
干杯,
Peter首先,在工厂bean上不需要init方法-它什么也不做-会话工厂只有一个连接,对其调用close()是不可操作的(CCF是SingleConnectionFactory的子类) 第二;缓存使用者是默认设置;会话永远不会关闭,除非会话数超过sessionCacheSize(已设置为100) 在缓存的会话上调用close()时,它会被缓存以供重用;这就是缓存连接工厂的作用,避免了为每个请求创建会话的开销
如果您不希望缓存会话、生产者和消费者的性能优势,请改用SingleConnectionFactory。有关CachingConnectionFactory,请参阅JavaDoc。使用
CachingConnectionFactory时,是否执行以下操作
在spring配置文件中,添加连接工厂配置详细信息如下:cacheConsumers=“false”
默认行为为true,导致队列中出现连接泄漏。感谢您提供的一些好信息。关闭消费者的理由是,他们都有相关id选择器,因此他们永远不会被重用。考虑到我没有其他消费者,我想我会像你建议的那样切换到SingleConnectionFactory。然而,这样你也会失去会话和生产者的缓存。实际上,您以前做的事情是正确的——使用cacheConsumers=false的缓存连接工厂。这样,你就能两全其美。