Мой вариант использования - получать сообщения Kafka, делать несколько попыток вызова отдыха и при исчерпании ресурсов выгружать неудавшееся сообщение в тему Kafka DLQ.
@StreamListener(EventSource.SOME_CHANNEL)
public void processMessage(Message<?> unsolicitedMessage) {
String aString = .....
oneService.act(aString);
}
@Retryable
отлично работает с точки зрения логики передачи для нескольких попыток.
@Retryable(value = {OneException.class, TwoException}, maxAttempts = 3,
backoff = @Backoff(delay = 1000))
public boolean act(String message, String endPoint) {
//do stuff
}
Для включения публикации Kafka DLQ в Spring Cloud Stream (enableDlq: true
) исключение необходимо передать в аннотированный метод @StreamListener
, чтобы связыватель Kafka мог выполнить необходимое.
Однако при этом я не могу использовать аннотированный метод @Recover
, где поток идеально приземляется после повторной попытки:
@Recover
public boolean recoverOnToDLQ(OneException ex, String message, String
endPoint) {
throw ex; //Required for StreamListener Kafka DLQ to kick in!
}
Вопрос: Есть ли способ запустить публикацию Kakfa DLQ из метода @Recover
без повторной генерации исключения?
Потому что, если я использую его только для повторного броска, я считаю, что не смогу эффективно использовать более жесткий контроль, полученный с его помощью. Это также упростит модульные тесты и лучше улавливает логику на уровне кода? Есть какие-нибудь мысли, как с этим лучше справиться?
Я использую все последние версии для spring-cloud, spring-cloud-stream и spring-retry на эту дату.