我正在使用 spring 集成在 Activity 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"/>
我注意到的是,使用此配置,为从 Activity mq 获取匹配请求而创建的消费者永远不会关闭。每个请求都会增加消费者数量。
我可以通过添加来阻止这种情况发生
<property name="cacheConsumers" value="false" />
到 CachingConnectionFactory。
但是根据 CachingConnectionFactory 的 java 文档:
Note that durable subscribers will only be cached until logical closing of the Session handle.
这表明 session 永远不会关闭。
这是坏事吗?有没有更好的方法来阻止消费者堆积?
干杯, 彼得
最佳答案
首先,您不需要在工厂 bean 上使用 init 方法 - 它什么都不做 - session 工厂只有一个连接,并且在其上调用 close() 是空操作。 (CCF 是 SingleConnectionFactory 的子类)。
第二个;缓存消费者是默认的; session 永远不会关闭,除非 session 数超过 sessionCacheSize(您已将其设置为 100)。
当在缓存 session 上调用 close() 时,它会被缓存以供重用;这就是缓存连接工厂的目的 - 避免为每个请求创建 session 的开销。
如果您不想要缓存 session 、生产者和消费者的性能优势,请改用 SingleConnectionFactory。请参阅 CachingConnectionFactory 的 JavaDoc。
关于java - 使用 spring 集成确保关闭 jms 消费者的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426333/