Будет ли поток прекращен? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть актеры, которые выглядят следующим образом:

enter image description here

Как вы можете видеть на изображении, ActorStream является потомкомActor.Вопрос в том, когда я прекращу действие 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 Ответ

1 голос

В вашем случае прекращение действия актера должно завершить поток, потому что под капотом актер следит за пройденным actorRef и завершает этап, если прибыл завершенный

Я думаю, вы можете найти больше информации здесь https://blog.colinbreck.com/integrating-akka-streams-and-akka-actors-part-ii/

Чрезвычайно важный аспект, который необходимо понять, состоит в том, что материализованный поток работает как набор действующих лиц в потоках контекста выполнения, в котором они были размещены.Другими словами, поток работает независимо от субъекта, который его выделил.Это становится очень важным, если поток является длительным или даже бесконечным, и мы хотим, чтобы субъект управлял жизненным циклом потока, так что, когда субъект останавливается, поток прерывается.Расширяя приведенный выше пример, я сделаю поток бесконечным и буду использовать KillSwitch для управления жизненным циклом потока.

...