Пружина: однопоточный потребитель - PullRequest
0 голосов
/ 22 ноября 2018

Некоторые работники (слушатели) должны обрабатывать сообщения одно за другим в однопоточном стиле.(Да, это слабое место, я знаю.) И, похоже, я не знаю, как правильно все настроить.Приложение зависает на Spring5, и это блокирует мне переход с Spring4.

Я хочу выделить : приложение должно иметь несколько однопоточных прослушивателей.Один слушатель для одной очереди.Я имею в виду некоторое количество.Не несколько слушателей для одной очереди.

Я использую kotlin.Но проблема в конфигурации или даже в ошибке библиотеки.

@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 Контейнер Фабрика для каждого вида на слушателях.
And ОДИН Кролик Соединение Фабрика (экземпляр CachingConnectionFactory)
Я не знаю, верно ли это.

Проблема в следующем:

Иногда приложение зависаетSpring5.На Spring 4 такая же конфигурация работает хорошо.Забавно, что он работает на машине с виртуализацией KVM.С Virtualbox работают хорошо даже с Spring5.

jstack https://pastebin.com/MXdHcVAK
top -H -p показывает, что PID 42 потребляет весь процессор

Некоторое время назад я пытался перейти на Spring5 с той же проблемой,Я думал, что это проблема с реактором-нетто, но не повезло, они не могут воспроизвести https://github.com/reactor/reactor-netty/issues/381

Я думаю, что эти две вещи - конфигурация и зависание - связаны.Но я не могу углубиться.

Обновление

О дампе: Если я все правильно понимаю (я не уверен), процессор потребляется "tcp-client-loop-nio-4" #24 daemon prio=5 os_prio=0 tid=0x00007fc0de44d800 nid=0x2a runnable записью в jstack.Но я не знаю, что с этим делать.

Update2

Ведущий разработчик Spring Integration и Spring AMQP - @GaryRussell - утвердить эту конфигурацию.Так что эта проблема касается netty, я думаю.

Update3

Эта проблема была исправлена ​​обновлением версии netty.

...