Это упрощение того, что у меня есть, но я не уверен, что это правильный способ сделать это
Это будет работать до тех пор, пока вам не понадобится любые блокирующие вызовы в вашем прокомментированном разделе обработки, но это не идеально ИМХО:
- Стилистически смешивание императивного и реактивного кода в одном методе не очень аккуратно
- Функционально этот подход не позволит вам вызывать какой-либо блокирующий код в вашей обработке, если вам это нужно (сейчас или в будущем).
Вместо этого я бы рекомендовал что-то вроде:
return Multi.createFrom().item(in)
.flatMap(m -> Uni.createFrom().item(m).repeat().atMost(5)) //Replace with your actual processing
.on().completion(in::ack);
..., который сохраняет весь метод как одну реактивную цепочку и дает вам возможность flatMap()
другим издателям, если вам нужно (например, если для вашей обработки требуется веб-вызов, вызов базы данных или какой-либо другой блокирующий ввод-вывод. )
Это правильный способ подтверждения входящего сообщения?
Если вы хотите, чтобы подтверждение происходило только по завершении обработки, да.
Единственный недостаток в том, что если catastrophi c сбой произошел на полпути обработки, возможно, некоторые из них могут быть обработаны до подтверждения in
. Единственное другое разумное поведение - использовать вместо него on().subscribed()
, что просто создает противоположную проблему (in
будет подтверждено, но некоторые или все сообщения могут не быть отправлены на ваш исходящий канал.) Какой из них предпочтительнее, зависит от вашего использования -корпус.