Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';使用spring集成确保关闭jms消费者的正确方法是什么?_Java_Jms_Spring Integration - Fatal编程技术网

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

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"

我正在使用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文档:

请注意,持久订阅者将只缓存到逻辑 关闭会话句柄

这意味着会议永远不会结束

这是件坏事吗?有没有更好的办法阻止消费者囤积

干杯,
Peter

首先,在工厂bean上不需要init方法-它什么也不做-会话工厂只有一个连接,对其调用close()是不可操作的(CCF是SingleConnectionFactory的子类)

第二;缓存使用者是默认设置;会话永远不会关闭,除非会话数超过sessionCacheSize(已设置为100)

在缓存的会话上调用close()时,它会被缓存以供重用;这就是缓存连接工厂的作用,避免了为每个请求创建会话的开销


如果您不希望缓存会话、生产者和消费者的性能优势,请改用SingleConnectionFactory。有关CachingConnectionFactory,请参阅JavaDoc。

使用
CachingConnectionFactory时,是否执行以下操作

在spring配置文件中,添加连接工厂配置详细信息如下:
cacheConsumers=“false”


默认行为为true,导致队列中出现连接泄漏。

感谢您提供的一些好信息。关闭消费者的理由是,他们都有相关id选择器,因此他们永远不会被重用。考虑到我没有其他消费者,我想我会像你建议的那样切换到SingleConnectionFactory。然而,这样你也会失去会话和生产者的缓存。实际上,您以前做的事情是正确的——使用cacheConsumers=false的缓存连接工厂。这样,你就能两全其美。