KStream在出错时可重复

时间:2018-05-31 16:16:14

标签: spring spring-boot spring-kafka

我有以下实现

    @Bean
    public KStream<Integer, String> kStream(StreamsBuilder kStreamBuilder) {
        KStream<Integer, String> stream = kStreamBuilder.stream("streamingTopic1");
        stream
                .mapValues(String::toUpperCase)
                .groupByKey()
                .reduce((String value1, String value2) -> value1 + value2,
                        TimeWindows.of(1000),
                        "windowStore")
                .toStream()
                .map((windowedId, value) -> new KeyValue<>(windowedId.key(), value))
                .filter((i, s) -> s.length() > 40)
                .to("streamingTopic2");

        stream.print();

        return stream;
    }

我希望在出现任何错误的情况下继续重试,直到邮件发送完毕。我知道Retryable注释,但我不知道如何处理抛出的异常并重试。

2 个答案:

答案 0 :(得分:0)

如果您只想重试该部分代码,可以手动编写代码:

Something smt = kStreamBuilder.stream("streamingTopic1");
            .mapValues(String::toUpperCase)
            .groupByKey()
            .reduce((String value1, String value2) -> value1 + value2,
                    TimeWindows.of(1000),
                    "windowStore")
            .toStream()
            .map((windowedId, value) -> new KeyValue<>(windowedId.key(), value))
            .filter((i, s) -> s.length() > 40)
            .collectToSomething();

while (true) {
    try {
        return smt.to("streamingTopic2");
    } catch (Exception ex) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            // log
        }
    }
}

最终,您不希望永远执行while,因此您可以选择创建重试限制

答案 1 :(得分:0)

请参阅StreamsConfig.RETRIES_CONFIG

  

“设置大于零的值将导致客户端重新发送任何因潜在瞬态错误而失败的请求。”;

kafka客户端本身将重试

  

public static final String RETRY_BACKOFF_MS_CONFIG =“retry.backoff.ms”;

     

public static final String RETRY_BACKOFF_MS_DOC =“尝试重试给定主题分区的失败请求之前等待的时间。这可以避免在某些故障情况下重复发送请求。”;