Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 流是否会终止?_Scala_Akka_Akka Typed - Fatal编程技术网

Scala 流是否会终止?

Scala 流是否会终止?,scala,akka,akka-typed,Scala,Akka,Akka Typed,我有演员,看起来如下: 如图所示,ActorStream是Actor的子项。 问题是,当我终止Actor时,ActorStream是否也会被终止 下面是我如何在Actor中创建ActorStream的方法: def create(fsm: ActorRef[ServerHealth], cancel: Option[Cancellable]): Behavior[ServerHealthStreamer] = Behaviors.setup { context =>

我有演员,看起来如下:

如图所示,
ActorStream
Actor
的子项。 问题是,当我终止
Actor
时,
ActorStream
是否也会被终止

下面是我如何在
Actor
中创建
ActorStream
的方法:

 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
      }
    }

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

我想你可以在这里找到更多的信息

需要理解的一个极其重要的方面是 流作为一组参与者在执行线程上运行 分配它们的上下文。换句话说,这条流是 独立于分配它的参与者运行。这就变成 如果流是长期运行的,甚至是无限的,那么这一点非常重要 希望参与者管理流的生命周期,以便 参与者停止,流终止。扩展示例 在上面,我将使流无限大,并使用KillSwitch来管理 河流的生命周期