gpt4 book ai didi

java - 使用 Spring 的 CachingConnectionFactory 时关闭 session

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:45 25 4
gpt4 key购买 nike

Java 文档 here与 Spring CachingConnectionFactory 相关的评论:

NOTE: This ConnectionFactory requires explicit closing of all Sessions obtained from its shared Connection. This is the usual recommendation for native JMS access code anyway. However, with this ConnectionFactory, its use is mandatory in order to actually allow for Session reuse.

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

<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();
}

}

我如何遵循从共享连接获得的 session 应该显式关闭的建议?

遇到了 SessionAwareMessageListener 接口(interface),该接口(interface)提供了提供 session 句柄的 onMessage 方法。那么要正确实现 session 关闭,是否应该实现这个接口(interface)?

最佳答案

将缓存连接工厂与监听器容器一起使用通常不是一个好主意,尤其是在使用 maxConcurrentConsumers > concurrentConsumers 时 - 您最终可能会在缓存,它在没有监听器的情况下获取消息,并且此类消息可能会“卡住”。

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

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

关于java - 使用 Spring 的 CachingConnectionFactory 时关闭 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com