В чем разница между SimpleMessageListenerContainer и DirectMessageListenerContainer в Spring AMQP? - PullRequest
0 голосов
/ 04 июня 2019

В чем разница между SimpleMessageListenerContainer и DirectMessageListenerContainer в Spring AMQP? Я проверил обе их страницы документации, у SimpleMessageListenerContainer почти нет объяснения внутренней работы, а у DirectMessageListenerContainer есть следующее объяснение:

SimpleMessageListenerContainer не так прост. Недавние изменения в Java-клиенте rabbitmq упростили намного более простой контейнер слушателя, который вызывает слушателя непосредственно в потоке клиента кролика-клиента. Свойство txSize отсутствует - каждое сообщение проверяется (или удаляется) по отдельности.

Я не очень понимаю, что это значит. Это говорит listener container that invokes the listener directly on the rabbit client consumer thread. Если так, то как SimpleMessageListenerContainer делает вызов?

Я написал небольшое приложение и использовал DirectMessageListenerContainer, и просто для того, чтобы увидеть разницу, я переключился на SimpleMessageListenerContainer, но, насколько я вижу, на стороне RabbitMQ не было никакой разницы. Со стороны Java разница была в методах (SimpleMessageListenerContainer предоставляет больше) и журналах (DirectMessageListenerContainer записал больше вещей)

Я хотел бы знать сценарии использования каждого из них.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

SMLC имеет выделенный поток для каждого потребителя (параллелизм), который опрашивает внутреннюю очередь.Когда новое сообщение поступает для потребителя в клиентском потоке, оно помещается во внутреннюю очередь, и потребительский поток забирает его и вызывает слушателя.Это требовалось в ранних версиях клиента для обеспечения многопоточности.С более новым клиентом это не проблема, поэтому мы можем вызвать слушателя напрямую (отсюда и имя).

Есть несколько других отличий, кроме txSize.

См. Выбор контейнера .

1 голос
/ 04 июня 2019

В DirectMessageListenerContainer некоторая логика перемещена в реализацию AMQP, в отличие от ListenerContainer, как и SimpleMessageListenerContainer

Это то, что Javadocs в SimpleMessageListenerContainer говорят для setTxSize () -

/**
 * Tells the container how many messages to process in a single transaction (if the channel is transactional). For
 * best results it should be less than or equal to {@link #setPrefetchCount(int) the prefetch count}. Also affects
 * how often acks are sent when using {@link AcknowledgeMode#AUTO} - one ack per txSize. Default is 1.
 * @param txSize the transaction size
 */
1005* Клиент отправляет подтверждение каждый раз, когда обрабатывается количество сообщений txSize.Это контролируется в методе
private boolean doReceiveAndExecute(BlockingQueueConsumer consumer) throws Throwable { //NOSONAR

    Channel channel = consumer.getChannel();

    for (int i = 0; i < this.txSize; i++) {

        logger.trace("Waiting for message from consumer.");
        Message message = consumer.nextMessage(this.receiveTimeout);
        .
        .

. В более новых реализациях каждое сообщение напрямую проверяется в потоке и основывается на транзакционной модели (один или издатель подтверждает ), которую потребитель отправляет подтвержденияКролику MQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...