в этом руководстве https://www.rabbitmq.com/api-guide.html Ребята из RabbitMQ заявляют:
Каналы и Concurrency Соображения (безопасность потока)
Канальные экземпляры не должны делиться между потоками. Приложения должны предпочесть использовать канал для потока, а не использовать один и тот же канал для нескольких потоков. Хотя некоторые операции над каналами безопасны для одновременного вызова, некоторые из них не приводят к некорректному чередованию кадров на проводе. Совместное использование каналов между потоками также будет мешать работе * Publisher Confirms.
Безопасность потоков очень важна, поэтому я старался быть настолько старательным, насколько это возможно, но здесь проблема:
У меня есть это приложение, которое получает сообщения от Rabbit. Когда сообщение получено, оно обрабатывает его, а затем запускается, когда оно выполняется. Приложение может обрабатывать всего 2 элемента одновременно в фиксированном пуле потоков с двумя потоками. Предварительная выборка QOS для Rabbit равна 2, потому что я не хочу, чтобы приложение было больше, чем может обрабатывать в течение периода времени.
Теперь моя потребительская доставкаДоставка:
Task run = new Task(JSON.parse(message));
service.execute(new TestWrapperThread(getChannel(),run,envelope.getDeliveryTag()));
На этом этапе вы уже поняли, что TestWrapperThread выполняет вызов channel.basicAck(deliveryTag, false);
как последнюю операцию.
По моему пониманию документации, это неверно и потенциально вредно, потому что канал не является потокобезопасным, и это поведение может повредить. Но как я должен это делать? Я имею в виду, у меня есть несколько идей, но они будут делать все более сложным, и я хотел бы понять, действительно ли это необходимо или нет.
Заранее спасибо