Custom Supervision.Decider没有捕获ActorPublisher

时间:2015-08-29 20:15:56

标签: scala akka akka-stream

我正在构建一个将由第三方使用的库。在我的一个方法中,我返回Stream[Item],它是从分页REST API调用的结果异步生成的。

我正在使用我对BulkPullerAsync的修改。我的代码是here

我希望我的流的收件人能够处理错误。根据{{​​3}},我应该使用自定义Supervision.Decider

val decider: Supervision.Decider = {
  case ex =>
    ex.printStackTrace()
    Supervision.Stop
}

implicit val mat = ActorMaterializer(ActorMaterializerSettings(system).withSupervisionStrategy(decider))

不幸的是,它并没有捕获我的ActionPublisher中抛出的异常。我看到它被处理了,ActorPublisher.onError被调用但它没有到达Supervision.Decider。它适用于文档中提供的简单Stream。

如果我使用Sink.actorRef,错误也无法触及演员。

我该怎么办?我希望Stream的用户不应该依赖于其实现的性质。

UPD :为了实验,我尝试了以下示例

val stream = Source(0 to 5).map(100 / _)
stream.runWith(Sink.actorSubscriber(props))

在这种情况下,Decider抓住了异常。

UPD2 :我试图通过从不同类型的来源生成Publisher来欺骗它,然后将它们转换回Source,期望所有错误都来到Subscriber.onError这确实发生了:)显然,混合使用ActorPublisher + Decider会出现问题......

总的来说,我认为这是一种不一致的行为。我无法使用一种机制来处理Stream中的错误。

0 个答案:

没有答案