|
4 | 4 |
|
5 | 5 | package com.lightbend.microprofile.reactive.streams.akka;
|
6 | 6 |
|
7 |
| -import akka.Done; |
8 | 7 | import akka.NotUsed;
|
| 8 | +import akka.japi.JavaPartialFunction; |
9 | 9 | import akka.stream.Attributes;
|
10 | 10 | import akka.stream.Materializer;
|
| 11 | +import akka.stream.SourceShape; |
11 | 12 | import akka.stream.javadsl.*;
|
12 | 13 | import org.eclipse.microprofile.reactive.streams.CompletionRunner;
|
13 | 14 | import org.eclipse.microprofile.reactive.streams.CompletionSubscriber;
|
|
22 | 23 | import org.reactivestreams.Processor;
|
23 | 24 | import org.reactivestreams.Publisher;
|
24 | 25 |
|
25 |
| -import java.util.Collection; |
26 |
| -import java.util.HashMap; |
27 |
| -import java.util.HashSet; |
28 |
| -import java.util.Map; |
29 |
| -import java.util.Set; |
| 26 | +import java.util.*; |
30 | 27 | import java.util.concurrent.CompletableFuture;
|
31 | 28 | import java.util.concurrent.CompletionStage;
|
32 | 29 | import java.util.function.BiConsumer;
|
@@ -260,6 +257,26 @@ else if (size == 1) {
|
260 | 257 | addFlowStage(Stage.OnComplete.class, (flow, stage) -> flow.via(TerminationPeeker.onComplete(stage.getAction())));
|
261 | 258 | addFlowStage(Stage.OnError.class, (flow, stage) -> flow.via(TerminationPeeker.onError(stage.getConsumer())));
|
262 | 259 | addFlowStage(Stage.OnTerminate.class, (flow, stage) -> flow.via(TerminationPeeker.onTerminate(stage.getAction())));
|
| 260 | + addFlowStage(Stage.OnErrorResume.class, (flow, stage) -> { |
| 261 | + Function<Throwable, Object> function = (Function) stage.getFunction(); |
| 262 | + return flow.recover(new JavaPartialFunction<Throwable, Object>() { |
| 263 | + @Override |
| 264 | + public Object apply(Throwable x, boolean isCheck) throws Exception { |
| 265 | + if (isCheck) return null; |
| 266 | + else return function.apply(x); |
| 267 | + } |
| 268 | + }); |
| 269 | + }); |
| 270 | + addFlowStage(Stage.OnErrorResumeWith.class, (flow, stage) -> { |
| 271 | + Function<Throwable, Graph> function = (Function) stage.getFunction(); |
| 272 | + return flow.recoverWithRetries(1, new JavaPartialFunction<Throwable, akka.stream.Graph<SourceShape<Object>, NotUsed>>() { |
| 273 | + @Override |
| 274 | + public akka.stream.Graph<SourceShape<Object>, NotUsed> apply(Throwable x, boolean isCheck) throws Exception { |
| 275 | + if (isCheck) return null; |
| 276 | + else return buildSource(function.apply(x)); |
| 277 | + } |
| 278 | + }); |
| 279 | + }); |
263 | 280 |
|
264 | 281 | // Sinks
|
265 | 282 | addSinkStage(Stage.FindFirst.class, stage -> Sink.headOption());
|
|
0 commit comments