Поток Spring Cloud отключить повторную попытку

#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 .