春季:单线程使用者

时间:2018-11-22 12:20:41

标签: netty spring-rabbitmq spring-rabbit reactor-netty

某些工作人员(侦听器)必须以单线程样式一一处理消息。 (是的,我知道这是薄弱点。)而且看起来,我不知道如何正确设置它。应用程序挂在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。但是我不知道该怎么办。

Update2

Spring Integration和Spring AMQP的主要开发人员-@GaryRussell-批准此配置。所以这个问题与我认为的净值有关。

0 个答案:

没有答案