使用Akka Typed时,在Actor生成过程中发送消息需要注意一些细节。下面给出一个示例代码来说明。
首先定义一个Actor协议:
object MyActorProtocol {
sealed trait Command
case class Start(replyTo: ActorRef[String]) extends Command
}
然后实现MyActor,它在生成过程中会发送一个消息给它的子Actor:
object MyActor {
def apply(): Behavior[MyActorProtocol.Command] =
Behaviors.setup { ctx =>
val child = ctx.spawn(childActor(), "child-actor")
ctx.log.info("Child actor is initialized and is ready to receive messages.")
child ! ChildActorProtocol.MyMessage("Hello, child actor!") //在生成过程中发送消息给子Actor
Behaviors.receiveMessage {
case MyActorProtocol.Start(replyTo) =>
ctx.log.info("Received start message.")
replyTo ! "Starting actor."
Behaviors.same
}
}
}
private object childActor {
def apply(): Behavior[ChildActorProtocol.Command] =
Behaviors.receiveMessage {
case ChildActorProtocol.MyMessage(msg) =>
println(s"Received a message: $msg")
Behaviors.same
}
}
在启动MyActor时,需要指定一个ActorRef来接收MyActor发送的消息:
object Main {
def main(args: Array[String]): Unit = {
val system = ActorSystem(MyActor(), "my-actor-system")
implicit val timeout = Timeout(5.seconds)
implicit val scheduler = system.scheduler
implicit val ec = system.executionContext
val responseFuture = system.ask[String](MyActorProtocol.Start).mapTo[String]
val response = Await.result(responseFuture, timeout.duration)
println(response)
system.terminate()
}
}
在MyActor生成过程中发送消息时,需要保证子Actor已经被生成并处于可用状态,否则可能会因为Actor路径未找到而抛出NullPointerException异常。