【发布时间】:2018-12-29 06:33:11
【问题描述】:
我的用例是接收 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
}
为了让 Spring Cloud Stream 内置的 Kafka DLQ 发布启动 (enableDlq: true),异常需要冒泡到 @StreamListener 注释的方法,以便 Kafka binder 执行必要的操作。
但是,在这样做时,我无法利用 @Recover 带注释的方法,该方法在重试后完美地降落:
@Recover
public boolean recoverOnToDLQ(OneException ex, String message, String
endPoint) {
throw ex; //Required for StreamListener Kafka DLQ to kick in!
}
问题:有没有办法从@Recover 方法中触发Kakfa DLQ 发布而不重新抛出异常?
因为如果我只用它来重新抛出,我相信我不会有效地利用其中获得的更严格的控制。这也将简化单元测试用例,并更好地捕获代码级别的逻辑?关于如何更好地处理这个问题有什么想法吗?
截至目前,我使用的是 spring-cloud、spring-cloud-stream 和 spring-retry 的所有最新版本。
【问题讨论】:
标签: spring-cloud spring-cloud-stream spring-kafka spring-retry