Как оправиться от Исключения, брошенного в Мойку Akka Streams? - PullRequest
0 голосов
/ 16 марта 2020

Как я могу восстановиться после исключения, брошенного в Мойку потоков Akka?

Простой пример:

    Source<Integer, NotUsed> integerSource = Source.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));

    integerSource.runWith(Sink.foreach(x -> {
      if (x == 4) {
        throw new Exception("Error Occurred");
      }
      System.out.println("Sink: " + x);
    }), system);

Вывод:

Sink: 1
Sink: 2
Sink: 3

Как я могу обработать исключение и перейти к следующему элементу из источника? (он же 5,6,7,8,9)

1 Ответ

2 голосов
/ 16 марта 2020

По умолчанию стратегия наблюдения останавливает поток при возникновении исключения. Чтобы изменить стратегию наблюдения, чтобы исключить вызывающее исключение сообщение и перейти к следующему сообщению, используйте стратегию «возобновить». Например:

final Function<Throwable, Supervision.Directive> decider =
  exc -> {
    return Supervision.resume();
  };

final Sink<Integer, CompletionStage<Done>> printSink =
  Sink.foreach(x -> {
    if (x == 4) {
      throw new Exception("Error Occurred");
    }
    System.out.println("Sink: " + x);
  });

final RunnableGraph<CompletionStage<Done>> runnableGraph =
  integerSource.toMat(printSink, Keep.right());

final RunnableGraph<CompletionStage<Done>> withResumingSupervision =
  runnableGraph.withAttributes(ActorAttributes.withSupervisionStrategy(decider));

final CompletionStage<Done> result = withResumingSupervision.run(system);

Вы также можете определить разные стратегии контроля для разных видов исключений:

final Function<Throwable, Supervision.Directive> decider =
  exc -> {
    if (exc instanceof MySpecificException) return Supervision.resume();
    else return Supervision.stop();
  };
...