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

标签 java jms spring-integration

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

相关文章:

java - RAP 应用程序单例

java - 使用 Spring Data Pageable 的 JPA Criteria 查询总和

java - 如何使用jms.Connection.setExceptionListner释放资源并重新连接?

c# - 通过 C# 将消息放入 Websphere MQ 与手动放置相同的消息具有不同的数据长度

Spring Integration 序列化 MessageHeader 对象

spring-integration - Spring云流从kinesis收到的消息中的特殊字符

java - 不修改Main方法java打印Hello World

java - openjdk-7-jre-headless 和 openjdk-7-jre(jdk) 有什么区别?

java - JMS 消息选择器是否通过单个 Consumer.receive() 调用或它看到的第一条消息拉取多条消息?

java - Spring Integration SFTP 上传非 XML 配置