Stream用户何时取消订阅?

时间:2017-11-24 10:18:13

标签: scala stream akka akka-stream

我正在使用 Akka Stream 2.5.5 。我有Stream其中:

  • 演员扮演着流的源头。我这样做是使用:Source.actorPublisher
  • Stream有多个阶段。如果是mapcollect等,我使用Recover来处理可能发生的异常。
  • 为了处理来自mapAsync()的错误,我使用监督策略:.withAttributes(supervisionStrategy(resumingDecider)))

现在,当我运行Stream时,我将akka.stream.actor.ActorPublisherMessage.Cancel传播到我的Source Actor。来自文档:

/**
   * This message is delivered to the [[ActorPublisher]] actor when the stream subscriber cancels the
   * subscription.
   */
  final case object Cancel extends Cancel with NoSerializationVerificationNeeded
  sealed abstract class Cancel extends ActorPublisherMessage 

令人惊讶的是,Stream中的任何Exception都没有引发任何stage。所以,我无法理解 why the stream subscriber cancels the subscription 。因此,我无法找到关于我的Stream失败的确切CauseError

对这种情况的任何见解和推理都会非常有帮助。

1 个答案:

答案 0 :(得分:0)

我终于通过使用recover stage作为我的流的最后一个阶段找到了原因。以前,我在我的流的每个阶段之后使用多个recover阶段,我记录错误并简单地将最后一个所需的值传递到下游。

现在,我在流的末尾只使用了一个recover stage,如下所示:

.recover {
          case e =>
            println("****************************")
            println("Throwing Exception. Cause: "+e.getMessage)
            println("****************************")
            throw e
        }

添加此内容后,抛出了实际的异常,我找到了实际原因。在我的情况下,其中一个阶段有代码抛出该异常。