繁体   English   中英

发送初始 akka 消息

[英]Sending an initial akka message

在阿卡结构下我的Parent者发送StartMessageParent的演员,然后发送ChildMessageChild演员。 在收到ChildMessage会调用一个 sys 进程来运行 sh 文件: "/Users/setup.sh" !! 为了确保在StartMessage之后发送DoM消息,我插入了一个 Thread.sleep :

parentActor ! StartMessage

Thread.sleep(5000)

parentActor ! DoM

StartMessage 最初需要在setup.sh执行其他参与者依赖的初始化时发送。 是否有替代机制可以防止在发送初始消息之前发送消息?

所有代码:

import akka.actor.{Actor, ActorRef, ActorSystem, Props, _}
import akka.stream.ActorMaterializer

import scala.sys.process._

case object ChildMessage
case object ReplyMessage
case object StartMessage
case object StopMessage
case object DoM

class Parent(child: ActorRef) extends Actor {
  var count = 0
  def incrementAndPrint { count += 1; println("incrementing and printing") }
  def receive = {
    case StartMessage =>
      println("Received StartMessage in child")
      incrementAndPrint
      child ! ChildMessage
    case ReplyMessage =>
    case DoM =>
      println("DoM")
    case _ => println("Parent got something unexpected.")
  }
}

class Child extends Actor {
  def receive = {
    case ChildMessage =>
      println("Received Child Message")
      "/Users/setup.sh" !!

      sender ! ReplyMessage
    case StopMessage =>
      println("Received Stop Message")
      context.stop(self)
    case _ => println("Child got something unexpected.")
  }
}

object Question {

  def main(args: Array[String]): Unit = {
    val system = ActorSystem("sys")
    implicit val materializer = ActorMaterializer.create(system)

    val childActor = system.actorOf(Props[Child], name = "RunServerC")
    val parentActor = system.actorOf(Props(new Parent(childActor)), name = "RunServerP")

    parentActor ! StartMessage

    Thread.sleep(5000)

    parentActor ! DoM


  }

}

你可以通过调用context.become来改变你的演员的行为。 此外,您可以定义两个新object以在收到意外消息时使用:

object Parent {
  case object NotYetInitialised
  case object AlreadyInitialised
}

class Parent(child: ActorRef) extends Actor {
  def receive = {
    case StartMessage =>
      println("Received StartMessage")
      child ! ChildMessage
      context.become(initialised)
    case _ =>
      println("Parent got something unexpected.")
      sender ! Parent.NotYetInitialised
  }

  def initialised: Receive = {
    case ReplyMessage =>
    case DoM => println("DoM")
    case ResetMessage => context.become(receive) // I made it up
    case StartMessage => sender ! Parent.AlreadyInitialised
    case _   => println("Parent got something unexpected.")
  }
}

您可以尝试 Akkaask方法向另一个参与者发送消息,但您必须记住的一件事是接收者参与者必须响应发送者参与者。 因此,在您的情况下,您可以使用 ask 作为同步调用或异步调用。

询问同步

Await.result(parentActor ? StartMessage, 10 seconds)

询问异步

import akka.pattern.ask
import scala.util.{Failure, Success}
import akka.util.Timeout

implicit val timeout = Timeout(10 seconds)
(parentActor ? StartMessage).onComplete{
    case Success(value) =>
    case Failure(exception) => 

}(context.dispatcher)

一旦你在子actor中完成了你的工作,就通过发送一些像sender() ! "Work is done"这样的消息来回复父actor sender() ! "Work is done" sender() ! "Work is done"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM