如何使Jms侦听器Bean成为非单个?

问题描述 投票:0回答:1

我们正在重写基于J2EE的服务,该服务在Websphere AS上运行,现在使用Spring 5.1 / Spring Boot 2.1(以Tomcat为目标平台)。该服务通过IBM MQ(具有固定数量的不同客户端的请求队列)获取请求,并使用相应的响应队列发送响应。

J2EE实现的一个重要部分是,对于每个输入队列,有一个可配置数量的MDB可以并行处理请求(这与用于处理后端系统的特定于客户机的连接数相对应。)>]

在我们新的Spring实现中,我们使用一个DefaultJmsListenerContainerFactory和几个@Component类,每个类都有一个@JmsListener注释方法。只要我们将自己限制在顺序消息处理中,一切就可以正常进行:并行性为1,单例bean处理一个消息之后处理另一个消息。

如果提高并发值,则会遇到预期的问题:由于我们的单例侦听器bean不是线程安全的,因此消息的并行处理会产生混乱。我们认为最简单的解决方案是使用每个侦听器Bean的多个实例(就像我们在J2EE中对MDB所做的那样),因此我们用@Scope(“ prototype”)注释了侦听器Bean类。

结果令人沮丧:根本没有消息处理了!在日志文件中,我们只能看到“正在创建单例bean的共享实例...”(为什么是singleton ??),但是构造函数的任何日志输出和错误消息都没有,因此很明显侦听器bean没有正确实例化。 。然后,我们尝试使用SimpleThreadScope而不是原型范围,但是尽管进行了正确的注册,这还是导致了同样的问题。

我试图检查此问题是否在其他任何地方发生,并且仅发现一种情况(https://github.com/spring-projects/spring-framework/issues/18045),但是由于未知原因,未解决的问题已关闭。

这是一个错误还是我过于乐观,无法通过更改@Scope来要求侦听器bean的多个实例?

我们正在重写基于J2EE的服务,该服务在Websphere AS上运行,现在使用Spring 5.1 / Spring Boot 2.1(以Tomcat为目标平台)。该服务通过IBM MQ(带有固定数量的...

spring-jms
1个回答
0
投票

根本没有消息处理了!

© www.soinside.com 2019 - 2024. All rights reserved.