Spring DefaultMessageListenerContainer - 会话缓存

时间:2015-10-12 14:36:14

标签: spring jms spring-jms xa

在我正在处理的应用程序中,我使用Spring JMS DefaultMessageListenerContainer和一个SessionAwareMessageListener的JMS使用者。还有一个XA transactionManager,在JMS和JDBC之间共享。作为JMS提供者,我使用WebLogic。

我所注意到的是,每次消费者收到消息时,JMS会话都与用于以前消息的会话完全不同:

    public void onMessage(Message message, Session session) throws JMSException {
                System.out.println("Session " + session);
    }

输出:

Session weblogic.jms.client.WLSessionImpl@17703c5b
Session weblogic.jms.client.WLSessionImpl@6b3390f
Session weblogic.jms.client.WLSessionImpl@2142f096
Session weblogic.jms.client.WLSessionImpl@19824dc
Session weblogic.jms.client.WLSessionImpl@7bf5b63b
Session weblogic.jms.client.WLSessionImpl@250d81

似乎JMS会话由DefaultMesageListenerContainer自动管理,并且它们不会被缓存 - 这让我担心性能。

在使用XA事务的JMS使用者的上下文中,使用某种级别的缓存(例如CACHE_SESSION)是否是一个好主意?

listenerContainer.setCacheLevel(DefaultMessageListenerContainer.CACHE_SESSION);

(如果需要,我可以提供更多代码片段,因为JMS配置是基于java的。)

1 个答案:

答案 0 :(得分:0)

请参阅该setter的javadoc:

 * <p>Default is {@link #CACHE_NONE} if an external transaction manager has been specified
 * (to reobtain all resources freshly within the scope of the external transaction),
 * and {@link #CACHE_CONSUMER} otherwise (operating with local JMS resources).

 * <p>Some Java EE servers only register their JMS resources with an ongoing XA
 * transaction in case of a freshly obtained JMS {@code Connection} and {@code Session},
 * which is why this listener container by default does not cache any of those.
 * However, depending on the rules of your server with respect to the caching
 * of transactional resources, consider switching this setting to at least
 * {@link #CACHE_CONNECTION} or {@link #CACHE_SESSION} even in conjunction with an
 * external transaction manager.

因此,您需要确定WebLogic是否支持此类配置。