Java Akka流开启故障,回退未重新启动流
我试图在Akka Streams javadsl中使用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似乎
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