#spring-cloud #spring-cloud-stream #spring-rabbit #spring-retry #spring-cloud-function
#spring-cloud #поток Spring-cloud-stream #spring-rabbit #весна-повторная попытка #spring-cloud-функция
Вопрос:
Я использую поток Spring Cloud с функцией Spring cloud с реактивным подходом. Мой связующий файл — RabbitMQ. По определению свойство maxAttempts — это количество раз, когда сообщение может быть обработано (это то, что я интерпретирую) из: https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.6.RELEASE/reference/html/spring-cloud-stream.html#_consumer_properties
maxAttempts: если обработка завершается неудачей, количество попыток обработать сообщение (включая первую). Установите значение 1, чтобы отключить повторную попытку. По умолчанию: 3.
Проблема в том, что мое приложение с этой конфигурацией (по умолчанию) всегда обрабатывало сообщение 4 раза. И теперь я хочу отключить повторную попытку, поэтому я устанавливаю max-attempts = 1, и сообщение всегда обрабатывается 2 раза. Я уже пытался установить spring.cloud.stream.rabbit.bindings.input.consumer.requeue-rejected=false
значение по умолчанию, хотя.
Есть какие-либо подсказки о том, как я могу обработать свое сообщение только один раз?
Спасибо.
Комментарии:
1. Это не имеет смысла; с
maxAttempts=1
связующее устройство не добавляетRetryTemplate
к адаптеру канала, поэтому повторных попыток не будет. Происходит что-то еще. Пожалуйста, приведите небольшой, полный пример, демонстрирующий такое поведение.2. Привет, Гэри, спасибо за ответ. Я создал небольшой проект, демонстрирующий проблему на github.com/moreirajo/spring-retry-demo
Ответ №1:
Хокстон.SR1 очень старый
Я могу понять, почему он был повторен с этими версиями; Я обновил ваш пример до последних версий, и теперь он поставляется только один раз…
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>retry-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>retry-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
Я не знаю, в какой версии это было исправлено.
Комментарии:
1. Спасибо, Гэри, это правда, что обновление версии Spring Cloud решает проблему, поэтому я приму ответ. Чего я не упомянул, так это того, что у меня есть другие зависимости в моем проекте, которые не работают с самыми последними версиями. Например github.com/spring-cloud/spring-cloud-vault/issues/409 . Итак, есть какой-либо обходной путь, который я мог бы сделать, чтобы отключить систему повторных попыток и по-прежнему оставаться в SR1?
2. С SR1 невозможно обойти, потому что повторная попытка (ошибочно) жестко запрограммирована для повторной попытки
maxAttempts
(вместоmaxAttempts - 1
). т. е.maxAttempts
обрабатывается как количество повторных попыток вместо общего количества попыток, включая исходную, и вы не можете установитьmaxAttempts=0
.