在Akka经典Ask模式中,Actor使用ask方法发送消息并等待响应。 ask方法将Future对象作为返回值,该对象包含接收到的响应消息。以下是一个示例,其中Actor1向Actor2发送一个字符串消息,Actor2返回大写的字符串响应消息。
Actor1代码:
import akka.actor.Actor
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
class Actor1 extends Actor {
implicit val timeout: Timeout = Timeout(5.seconds)
val actor2 = context.actorOf(Actor2.props)
override def receive: Receive = {
case message: String =>
val response: Future[String] = (actor2 ? message).mapTo[String]
response.onComplete {
case scala.util.Success(res) => println(s"Actor1 received response: $res")
case scala.util.Failure(t) => println(s"Actor1 received failure: $t")
}
}
}
Actor2代码:
import akka.actor.{Actor, Props}
class Actor2 extends Actor {
override def receive: Receive = {
case message: String =>
val response = message.toUpperCase
sender() ! response
}
}
object Actor2 {
def props: Props = Props[Actor2]
}
在Actor1中,使用ask方法发送字符串消息并等待响应,响应将被映射到Future String,并在onComplete回调函数中处理响应或失败。在Actor2中,接收到字符串消息后,将该消息转换为大写,并使用sender()方法将响应消息发送回Actor1。
上一篇:Akka仅保存/持久化最新状态