gpt4 book ai didi

java - 使用 spring 集成确保关闭 jms 消费者的正确方法是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:57 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com