我正在构建一个将由第三方使用的库。在我的一个方法中,我返回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
中的错误。