Некоторые работники (слушатели) должны обрабатывать сообщения одно за другим в однопоточном стиле.(Да, это слабое место, я знаю.) И, похоже, я не знаю, как правильно все настроить.Приложение зависает на 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.