当前位置: 首页 > 知识库问答 >
问题:

Spring DefaultMessageListenerContainer-会话缓存

虞华翰
2023-03-14

在我正在开发的应用程序中,我使用了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个答案

司寇阳曦
2023-03-14

有关该setter,请参见javadocs:

 * <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是否支持这种配置。

 类似资料:
  • 我使用Infinispan缓存作为会话作用域bean,在Spring MVC应用程序中缓存与用户相关的数据对象。 现在我们迁移到Spring引导,我们想使用@enableRedisHttp会话,但我们面临的问题是,附加到会话的InfinispanCacheManager是不可序列化的,产生以下异常: 通常,我们会平衡用户对多个节点的请求,因此需要在节点之间共享缓存(使用Redis store)。

  • 问题内容: 我正在“事务化”一些广泛的数据库操作,并且遇到了以下问题:如果我通过hibernate模式运行sql查询,但未使用MQL方法,则数据库视图似乎不正确。具体来说,在大多数情况下,代码以更适当的方式使用hibernate模式,但是在某些地方,有人决定只执行sql。我不喜欢他们这样做,但是在这一点上“这就是事实”。 我发现了一个解释,这似乎解释,但所有的示例都是WRT实际上得到和管理代码交易

  • 管理浏览器 session ,Cookie,缓存,代理设置等。 进程: 主进程​ session模块可以用来创建新的 Session对象,你也可以通过使用 webContents 的 session属性或模块访问现有页面的 session. 1 const {BrowserWindow} = require('electron') 2 let win = new BrowserWindow({wi

  • 问题内容: 通过多个实例扩展Web应用程序是Azure云的最大优势之一。为了实现对我们的Web角色云应用程序的多个VM支持,我们正在实现Azure Redis缓存。我们正在使用RedisSessionStateProvider提供程序来维护会话状态。以下是web.config文件中会话管理的配置设置。 我们的问题是会话超时不会随着用户的回发而延长,假设我们的用户在10:00 AM登录到应用程序,那

  • 我的应用程序通过Infinispan Spring Boot Starter使用Infinispan的Spring会话实现。我通过使用嵌入式模式。Spring会话集成留档非常稀疏,它没有提到任何关于会话缓存的推荐缓存模式的内容。 我一直在使用DIST_SYNC模式,但我注意到日志中偶尔会出现错误。是否有更合适的缓存模式,或者这可能是错误? 我使用的是Spring Boot 2.2.10、Infin

  • 我正在为我的服务编写单元测试。 当应用程序运行时,每次进入方法A都会创建一个新的事务。而是在单元测试执行期间——当test testMethod进入时。所以方法A不会创建新的。为了进行正确的测试,我需要在每次调用内部测试服务之前清除缓存。我不想在每个单元测试中的任何服务调用之前编写Session.clear()。这里的最佳实践是什么?