【问题标题】:How to get object that caused failure in Akka Streams?如何获取导致 Akka Streams 失败的对象?
【发布时间】:2016-07-10 19:09:42
【问题描述】:

根据akka streams docs,可以通过定义一个将Throwable 映射到Strategy 的决策器来处理流故障:

val decider: Supervision.Decider = {
  case _: ArithmeticException => Supervision.Resume
  case _                      => Supervision.Stop
}

我想知道是否有办法也可以访问导致错误的元素。当然,这个元素的类型是未知的,但是有没有办法把它作为Object的实例来获取呢?

【问题讨论】:

  • 如果有异常,则没有元素。异常不是由流元素引起的,而是由代码引起的。 Source.single(throw new Exception()) 中的“错误元素”在哪里?
  • 是的,但如果我有一个 Flow[Int, Int, ...],则有 Ints 正在流经管道,我需要找到导致流中异常的元素。
  • 我支持@GiovanniCaporaletti。 Failureserrors 根本不同 - 如果您的流因某些特定整数而失败(例如,它不喜欢数字 42),您可以用 try-catch 包装有问题的阶段并在那里检查;您可以查看Throwable 堆栈跟踪以了解哪个阶段导致了问题。另一方面,Failure 意味着整个事情都爆发了,它通常不连接到单个元素(想想外部依赖崩溃、内存不足等)
  • @Mihai238 可能会尝试编辑您的问题,添加一个“元素导致异常”并且您无法获得“那个元素”的示例。您将意识到流的元素与引发异常的特定阶段之间没有任何联系。在最坏的情况下,我们了解您想要实现的目标并找到解决方案。

标签: scala akka reactive-programming akka-stream


【解决方案1】:

简单的方法是在抛出它的位置附近捕获ArithmeticException,并抛出您的自定义异常MyDetailedArithmeticException(culprit: Int),该异常将打印导致消息中问题的int

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2015-01-11
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多