为什么异常不能阻止Akka Stream流程

时间:2015-01-08 15:51:24

标签: scala stream akka akka-stream

我有一个依赖于API响应的流程。如果响应不符合我的预期,则抛出异常。这种策略适用于Spray和使用specs2进行直接方法测试。

但是,当我尝试使用具有异常抛出模块的流时,流程就会暂停。

这是我的流程:

 Source(() => file)
      .via(csvToSeq)
      .via(getFromElastic)
      .via(futureExtrtactor)
      .via(findLocaionOfId)
      .foreach(v => v.map(v => println("foreached", v)))
      .onComplete(_ => system.shutdown())

我的策略是将map用于期货。

像这样:

 val findLocaionOfId = Flow[Future[Seq[(String, JsValue)]]].map(future => future.map(jsSeq => {
      jsSeq.zipWithIndex.flatMap { case (x, i) => x._2.asJsObject.getFields("_source").flatMap(js => {
        js.asJsObject("Couldn't convert").getFields("externalId").map({
          case JsString(str) => {
              (i + 1, i == 0, js)
            }
            else (i, false, js)
          }
          case _ => (i, false, x)
        })
      })
      }
    }))

这是一个完全不同位置的潜在异常投掷者:

val encoded_url = URLEncoder.encode(url, "UTF-8")

好像我错过了什么,却看不出来。谢谢你的任何指示。

2 个答案:

答案 0 :(得分:3)

这听起来像是Supervision for Akka Streams实施后将要解决的问题。 Akka Streams仍处于“预试验阶段”,因此该功能尚未实施,但绝对计划很快加入。

//撰写此评论时,当前版本为1.0-M2(预览里程碑)。

答案 1 :(得分:3)

我遗失的是mapAsync

将上述功能更改为:

val findLocaionOfId = Flow[Future[Seq[(String, JsValue)]]].mapAsync({...})

这样,期货就会被解开,例外会按预期停止。