流会终止吗?

时间:2019-06-28 07:13:16

标签: scala akka akka-typed

我有演员,如下所示:

enter image description here

您可以在图像上看到,ActorStreamActor的子级。 问题是,当我终止Actor时,ActorStream也将终止吗?

这是在ActorStream中创建Actor的方式:

 def create(fsm: ActorRef[ServerHealth], cancel: Option[Cancellable]): Behavior[ServerHealthStreamer] =
    Behaviors.setup { context =>
      implicit val system = context.system
      implicit val materializer = ActorMaterializer()
      implicit val dispatcher = materializer.executionContext

      val kafkaServer = system
        .settings
        .config
        .getConfig("kafka")
        .getString("servers")

      val sink: Sink[ServerHealth, NotUsed] = ActorSink.actorRefWithAck[ServerHealth, ServerHealthStreamer, Ack](
        ref = context.self,
        onCompleteMessage = Complete,
        onFailureMessage = Fail.apply,
        messageAdapter = Message.apply,
        onInitMessage = Init.apply,
        ackMessage = Ack)

      val cancel = Source.tick(1.seconds, 15.seconds, NotUsed)
        .flatMapConcat(_ => Source.fromFuture(health(kafkaServer)))
        .map {
          case true =>
            KafkaActive
          case false =>
            KafkaInactive
        }
        .to(sink)
        .run()

      Behaviors.receiveMessage {
        case Init(ackTo) =>
          ackTo ! Ack
          Behaviors.same
        case Message(ackTo, msg) =>
          fsm ! msg
          ackTo ! Ack
          create(fsm, Some(cancel))
        case Complete =>
          Behaviors.same
        case Fail(_) =>
          fsm ! KafkaInactive
          Behaviors.same
      }
    }

1 个答案:

答案 0 :(得分:1)

在您的情况下,演员终止必须终止流,因为在幕后阶段,演员观看通过了actorRef,如果终止了到达,则完成舞台

我想您可以在此处找到更多信息 https://blog.colinbreck.com/integrating-akka-streams-and-akka-actors-part-ii/

  

要理解的一个非常重要的方面是物化   流在执行线程上作为一组参与者运行   分配它们的上下文。换句话说,流是   独立于分配它的演员运行。这变成   如果流是长期运行的,甚至是无限的,则非常重要,我们   希望演员管理流的生命周期,例如   演员停止,流终止。扩展示例   上面,我将使流无限,并使用KillSwitch进行管理   流的生命周期。