Java Akka流开启故障,回退未重新启动流

Java Akka流开启故障,回退未重新启动流,java,akka,akka-stream,akka-http,Java,Akka,Akka Stream,Akka Http,我试图在Akka Streams javadsl中使用RestartFlow来重新启动我的一个流阶段,如果该阶段出现任何故障,但它似乎没有重新启动流,而是删除消息 我已经看到了:,但我的版本是2.5.19,所以它应该被修复吗 我尝试了使用回退的RestartFlow.onFailuresWithBackoff和使用回退的RestartFlow.withBackoff,但这两种方法都不起作用。我也尝试过使用整个Actor系统管理器策略,但这似乎只是拦截异常,这样它就不会从流中抛出,而且plus似乎

我试图在Akka Streams javadsl中使用
RestartFlow
来重新启动我的一个流阶段,如果该阶段出现任何故障,但它似乎没有重新启动流,而是删除消息

我已经看到了:,但我的版本是2.5.19,所以它应该被修复吗

我尝试了使用回退的
RestartFlow.onFailuresWithBackoff
和使用回退的
RestartFlow.withBackoff
,但这两种方法都不起作用。我也尝试过使用整个Actor系统管理器策略,但这似乎只是拦截异常,这样它就不会从流中抛出,而且plus似乎没有提供我想要的退避和最大重试策略

溪流:

public Consumer.DrainingControl<Done> stream() {
    return Consumer.committableSource(consumerSettings,
        Subscriptions.topics(config.getString(ConfigKeys.KAFKA_CONFIG_PREFIX +
            ConfigKeys.CONSUMER_TOPIC)))
        .via(RestartFlow.onFailuresWithBackoff(
                Duration.ofSeconds(1), // min backoff
                Duration.ofSeconds(2), // max backoff,
                0.2, // adds 20% "noise" to vary the intervals slightly
                10, // limits the amount of restarts to 10
                this::dispatchMessageFlow))
        .via(Committer.flow(CommitterSettings.create(system)))
        .toMat(Sink.ignore(), Keep.both())
        .mapMaterializedValue(Consumer::createDrainingControl)
        .run(mat);
}

如果有人能帮我指出正确的方向,我将不胜感激。

它的工作方式有点不同。长话短说-如果发生错误,消息将被丢弃,但源/流将重新启动,而不会杀死整个流。如图所示:

重启过程本质上是有损的,因为取消和发送消息之间没有协调。来自包装流任意一端的终止信号将导致另一端终止,任何传输中的消息都将丢失。在回油过程中,该流量将产生回压


明白了,谢谢!我有点明白这一点,只是实现了我自己的RunnableGraph,将失败发送回源代码进行重试。
private Flow<ConsumerMessage.CommittableMessage<String, String>,
    ConsumerMessage.Committable, NotUsed> dispatchMessageFlow() {
    return Flow.<ConsumerMessage.CommittableMessage<String, String>>create()
            .mapAsyncUnordered(
                config.getInt(ConfigKeys.PARALLELISM),
                msg ->
                    streamProcessor.process(msg.record().value())
                        .whenComplete((done, e) -> {
                            if (e != null) {
                                throw new RuntimeException(e);
                            } else {
                                if (done.status().isSuccess()){
                                    streamingConsumerLogger.info("Successfully posted message, got response:\n{}",
                                        done.toString());
                                } else {
                                    throw new RuntimeException("HTTP Error!");
                                }
                            }
                        })
                        .thenApply(done -> msg.committableOffset()));
}
java.util.concurrent.CompletionException: java.lang.RuntimeException: HTTP Error!
    at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292)
    at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308)
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:769)
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736)
    at java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:443)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.RuntimeException: HTTP Error!
    at com.company.app.messageforwarder.StreamingConsumerService.lambda$null$0(StreamingConsumerService.java:72)
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
    ... 6 more