这里与 Spring CachingConnectionFactory 相关的 java 文档有评论:
注意:此 ConnectionFactory 需要显式关闭从其共享连接中获得的所有会话。无论如何,这是本机 JMS 访问代码的通常建议。但是,对于这个 ConnectionFactory,它的使用是强制性的,以便实际允许 Session 重用。
我不清楚如何在我的应用程序中使用以下给定的配置来处理这个问题。
<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>
监听器类是这样的:
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();
}
}
}
我如何遵循从共享连接获得的会话应该明确关闭的建议?
遇到了 SessionAwareMessageListener 接口,该接口提供了提供 Session 句柄的 onMessage 方法。那么要正确实现会话关闭,应该实现这个接口吗?