Scala 如何应对akka流中的异常(上游故障)

Scala 如何应对akka流中的异常(上游故障),scala,akka,akka-stream,akka-http,Scala,Akka,Akka Stream,Akka Http,我有一个akkaFlow[I,O],我无法控制,因为它来自第三方代码。每当输入元素不生成输出元素时(例如,因为在流的某个部分引发了异常),我就需要做出反应。为此,我需要产生故障的输入元素。我在流中找不到允许我注册处理程序或以任何方式对其作出反应的API或类似API。我该怎么做?当akka streams流引发异常时,您希望恢复而不是停止。在收集所有成功的元素之后,您可以Seq#diff来判断由于抛出异常而丢弃了哪些元素 导入scala.concurrent.ExecutionContext 导入

我有一个akka
Flow[I,O]
,我无法控制,因为它来自第三方代码。每当输入元素不生成输出元素时(例如,因为在流的某个部分引发了异常),我就需要做出反应。为此,我需要产生故障的输入元素。我在流中找不到允许我注册处理程序或以任何方式对其作出反应的API或类似API。我该怎么做?

当akka streams流引发异常时,您希望
恢复而不是
停止。在收集所有成功的元素之后,您可以
Seq#diff
来判断由于抛出异常而丢弃了哪些元素

导入scala.concurrent.ExecutionContext
导入scala.util.{失败,成功}
对象异常{
案例类MyException(n:Int)扩展了RuntimeException
def main(参数:数组[字符串]):单位={
隐式val系统:ActorSystem=ActorSystem(“异常”)
隐式val ec:ExecutionContext=system.dispatcher
val决策者:监督。决策者={
案例:MyException=>Supervision.Resume
案例=>监督。停止
}
val流量=流量[Int]
.map(n=>
如果(n%2==1)抛出MyException(n)
其他
)
val in=1到10
val OUTPUTURE=源(英寸)
.通过(流量)
.具有属性(ActorAttributes.监督策略(decider))
.runWith(水槽序号)
完成{
案例成功(out)=>
println(“删除的元素是”+(in.diff(out)))
案例失败()=>
println(“未知故障”)
}
}
}
控制台输出为:

dropped elements are Vector(1, 3, 5, 7, 9)
参考: