Я пытаюсь увидеть разницу между DirectMessageListener
и SimpleMessageListener
. У меня есть этот рисунок, чтобы спросить, является ли он правильным.
Позвольте мне попытаться описать, как я его понял, и, возможно, вы скажете мне, если он правильный.
Перед spring-rabbit
находится java-библиотека rabbit-client
, которая подключается к серверу rabbit-mq и доставляет сообщения в библиотеку spring-rabbit. У этого клиента есть ThreadPoolExecutor
(что в данном случае, я думаю, - 16 потоков). Таким образом, не имеет значения, сколько очередей в кролике - если есть одно соединение, я получаю 16 потоков. Эти же потоки используются повторно, если я использую DirectMessageListener
- и этот метод-обработчик listen
выполняется во всех этих 16 потоках, когда приходят сообщения. Поэтому, если я делаю что-то сложное в обработчике, rabbit-client
должен дождаться освобождения потока, чтобы получить следующее сообщение, использующее этот поток. Также, если я увеличу setConsumersPerQueue
до 20, скажем, это создаст 20 потребителей на очередь, но не потоков. Эти 20 * 5 потребителей в моем случае все будут повторно использовать эти 16 потоков, предлагаемые ThreadPoolExecutor
?
SimpleMessageListener
, с другой стороны, будут иметь свои собственные потоки. Если одновременных потребителей == 1 (я думаю, по умолчанию, как в моем случае), он имеет только один поток. Всякий раз, когда есть сообщение в любой из secondUseCase*
очередей, java-библиотека rabbit-client
будет использовать в моем случае один из 16 потоков для пересылки сообщения в один внутренний поток, который у меня есть в SimpleMessageListener
. Как только он пересылается, поток библиотеки java rabbit-client
освобождается, и он может вернуться к получению большего количества сообщений с кроличьего сервера.