4

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

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

这表明会话永远不会关闭。

这是坏事吗?有没有更好的方法来阻止消费者堆积?

干杯,彼得

4

2 回答 2

4

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

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

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

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

于 2012-05-03T12:27:21.340 回答
0

使用时以下是否有效cachingConnectionFactory

在您的 spring 配置文件中添加连接工厂配置详细信息,如下所示:cacheConsumers="false"

默认行为为,这导致队列中的连接泄漏。

于 2013-06-11T13:29:25.447 回答