Вызовите слушателя повторных попыток из другого слушателя, поддерживающего всю логику повторных попыток. - PullRequest
0 голосов
/ 23 марта 2020

Используем spring-kafka-2.2.8. ВЫПУСК. У меня есть конкретная c ситуация, когда мне нужна помощь. У меня есть 4 темы topi c, retryTopi c, successTopi c и errorTopi c. Если topi c не удается, следует перенаправить на retryTopi c, где будут сделаны 3 попытки повторить попытку. Если эти попытки не удаются, необходимо перенаправить на errorTopi c. В случае успеха на обоих topi c и retryTopi c, следует перенаправить на sucessTopi c. Эта ситуация уже реализована на основе вопроса Как повторить попытку с пружинной кафкой версии 2..2 . Но теперь у меня возникла новая ситуация, когда мне нужно вызвать retryTopi c слушатель изнутри topi c слушатель на основе ошибки бизнес-логики c без Было сгенерировано исключение (оно уже вызывает retryTopi c, когда генерируется исключение, и оно должно оставаться с таким поведением). И еще мне нужно знать, по какому номеру попытки повторной попытки retryTopi c был назван параметром слушателя ниже.

 @KafkaListener(id = "so60172304.2", topics = "retryTopic")
 public void listen2(String in) {
            RetryTemplate retryTemplate = new RetryTemplate();
    retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
        @Override
        public Void doWithRetry(RetryContext retryContext) throws RuntimeException {
             // Can I get the retry count here? It didn't work
             Integer count =RetrySynchronizationManager.getContext().getRetryCount());
            return this.doWithRetry(retryContext);
        }
    }); 
  }

1 Ответ

0 голосов
/ 23 марта 2020

Нет причин, по которым вы не можете вызвать одного слушателя из другого (но вы не получите повторных попыток, если не вызовете его, используя RetryTemplate в первом методе).

Если вы используете RetryTemplate сконфигурирован на фабрике контейнеров для выполнения повторных попыток (вместо добавления BackOff к SeektoCurrentErrorHandler в версиях 2.3.x и выше), вы можете получить количество повторов (начиная с нуля) следующим образом ...

@KafkaListener(id = "so60172304.2", topics = "retryTopic")
public void listen2(String in) {
    int retryCount = RetrySynchronizationManager.getContext().getRetryCount();
    ...
}

getContext() вернет ноль, если вы вызовете это напрямую из первого метода (если вы не заключите вызов в RetryTemplate.execute()).

В 2.5.xa заголовок попытки доставки будет быть доступным (опционально) даже при использовании SeektoCurrentErrorHandler с BackOff вместо использования RetryTemplate на фабрике контейнеров.

...