使用Spring的CachingConnectionFactory时关闭会话

Gau*_*rav 8 java spring jms spring-jms

这里与Spring CachingConnectionFactory相关的java doc 有评论:

注意:此ConnectionFactory需要显式关闭从其共享Connection获取的所有Sessions.无论如何,这是本机JMS访问代码的通常建议.但是,使用此ConnectionFactory,必须使用它才能实际允许会话重用.

我不清楚如何使用我的应用程序中的以下给定配置来处理这个问题.

<bean id="springApp" class="com.codereq.springcore.jms.SpringJMSListenerApp"  />

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="destination" ref="destination"/>
    <property name="messageListener" ref="messageListener"/>
    <property name="sessionTransacted" value="true"/>
    <property name="concurrentConsumers" value="5" />
    <property name="maxConcurrentConsumers" value="15" />
</bean>

<bean id="messageListener" class="com.codereq.springcore.jms.MessageListenerApp" />

<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"
        p:targetConnectionFactory-ref="emsConnectionFactory"
        p:sessionCacheSize="100" 
        p:cacheConsumers="true" />

<bean id="emsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="GenericConnectionFactory"/>
    <property name="jndiTemplate" ref="jndiTemplate"/>
</bean>


<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">com.tibco.tibjms.naming.TibjmsInitialContextFactory</prop>
            <prop key="java.naming.provider.url">tibjmsnaming://localhost:7222</prop>
            <prop key="java.naming.security.principal">admin</prop>
            <prop key="java.naming.security.credentials">admin</prop>
        </props>
    </property>
</bean>

<bean id="destination" class="com.tibco.tibjms.TibjmsQueue">
    <constructor-arg value="com.sample.queue" />
</bean>
Run Code Online (Sandbox Code Playgroud)

监听器类是这样的:

public class MessageListenerApp implements MessageListener {

private static int c = 0;

@Override
public void onMessage(Message arg0) {

    try {
        System.out.println("Received Message..."+arg0.getStringProperty("MessageNum")+". Waiting to finish..");
        Thread.sleep(2000);
        System.out.println("Finished processing.."+arg0.getStringProperty("MessageNum")+".."+(c++));
    } catch (Exception e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

}

如何遵循应明确关闭从共享连接获取的会话的建议?

遇到SessionAwareMessageListener接口,该接口提供onMessage方法,该方法为Session提供句柄.那么要正确实现会话结束,是否应实现此接口?

Gar*_*ell 5

将缓存连接工厂与侦听器容器一起使用通常不是一个好主意,尤其是在使用maxConcurrentConsumers> 时concurrentConsumers- 您最终可能会在缓存中缓存消费者,它们在没有侦听器的地方获取消息,而此类消息可能会“卡住” ”。

因此,CCF在这种情况下不要使用 a ,它实际上是用于生产者方面的。

由于容器管理并发,会话/消费者是长期存在的,不需要缓存。