2016-09-25 7 views
0

У меня очередь, в которой слушатель слушает очередь с некоторым количеством отсчетов предварительной выборки, говорит 10. Он передает эти 10 элементов на какой-то процессор. Процессор может обрабатывать некоторые задачи или не может или задерживать его. И я хочу удалить его (channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);) из очереди после получения такой информации.Функция механизма обратного вызова с ChannelAwareMessageListener

Что может быть лучшим способом достичь этого? Одна идея пришла ко мне, что я создаю еще одну очередь, и я вытолкнул обработанные сообщения с тегом доставки и ссылкой канала в него из процессора. И я послушаю эту новую очередь и сделаю это на основе этого.

ответ

0

Каналы не являются потокобезопасными - см. rabbitmq documentation.

Имена каналов не должны распространяться между потоками. Приложения должны предпочесть использовать канал для потока, а не использовать один и тот же канал для нескольких потоков. Хотя некоторые операции над каналами безопасны для одновременного вызова, некоторые из них не приводят к некорректному чередованию кадров на проводе. Совместное использование каналов между потоками также будет мешать работе * Publisher Confirms.

Вы должны использовать только канал, открытый ChannelAwareMessageListener на самой нити слушателя.

Если вы пытаетесь достичь параллелизма, обычно лучше использовать свойство контейнера concurrentConsumers, а не передавать сообщения другим потокам.