[英]Sending an initial akka message
在阿卡结构下我的Parent
者发送StartMessage
于Parent
的演员,然后发送ChildMessage
以Child
演员。 在收到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.