某些工作人员(侦听器)必须以单线程样式一一处理消息。 (是的,我知道这是薄弱点。)而且看起来,我不知道如何正确设置它。应用程序挂在Spring5上,这阻止了我从Spring4迁移。
我要突出显示:应用程序应具有多个单线程侦听器。一个队列的一个侦听器。我的意思是。一个队列没有多个侦听器。
我用科特林。但是麻烦在于配置,甚至是库错误。
@RabbitListener(
queues = [(queueName1)],
containerFactory = "exclusiveListenerContainerFactory"
)
fun handle1(...
@RabbitListener(
queues = [(queueName2)],
containerFactory = "exclusiveListenerContainerFactory"
)
fun handle2(...
@Bean
open fun exclusiveListenerContainerFactory(
connectionFactory: ConnectionFactory,
messageConverter: MessageConverter
): SimpleRabbitListenerContainerFactory {
val factory = SimpleRabbitListenerContainerFactory()
factory.setConnectionFactory(connectionFactory)
factory.setConcurrentConsumers(1)
factory.setMessageConverter(messageConverter)
factory.setDefaultRequeueRejected(false)
return factory
}
对于每种监听器,我都使用 SINGLE ExclusiveListener Container Factory。
和 SINGLE 兔子 Connection 工厂(CachingConnectionFactory的实例)
我不知道这是正确的。
有时,应用程序挂在Spring5上。在Spring 4上,相同的配置运行良好。有趣的是,它可以在具有KVM虚拟化的机器上使用。通过Virtualbox,即使使用Spring5也可以很好地工作。
jstack https://pastebin.com/MXdHcVAK
top -H -p显示PID 42消耗了所有CPU
前段时间,我试图以同样的麻烦搬到Spring5。我以为这是反应堆网库问题,但是没有运气,他们无法复制https://github.com/reactor/reactor-netty/issues/381
我认为这两件事-配置和挂起-是必不可少的。但是我无法深入。
关于转储:
如果我正确理解所有内容(不确定),则jstack中的"tcp-client-loop-nio-4" #24 daemon prio=5 os_prio=0 tid=0x00007fc0de44d800 nid=0x2a runnable
条目会消耗cpu。但是我不知道该怎么办。
Spring Integration和Spring AMQP的主要开发人员-@GaryRussell-批准此配置。所以这个问题与我认为的净值有关。