在本文中,我们将对actor的创建进行介绍,并主要讲解一下Ask模式。虽然在Actor中,更受欢迎的是Tell模式,但是我们还是有必要了解一下稍微复杂一点的Ask模式。
一、Actor的创建
一个actor对象是由actorOf()方法创建的,需要一个Props参数和一个名字(字符串)。
object DemoActor {
/**
* Create Props for an actor of this type.
*
* @param magicNumber The magic number to be passed to this actor’s constructor.
* @return a Props for creating this actor, which can then be further configured
* (e.g. calling `.withDispatcher()` on it)
*/
def props(magicNumber: Int): Props = Props(new DemoActor(magicNumber))
}
class DemoActor(magicNumber: Int) extends Actor {
def receive = {
case x: Int => sender() ! (x + magicNumber)
}
}
class SomeOtherActor extends Actor {
// Props(new DemoActor(42)) would not be safe
context.actorOf(DemoActor.props(42), "demo")
// ...
}
上面是Akka官方推荐的构建方式,一个class用来定义Actor,一个object用来提供props方法。Props的内容会在之后的学习中,在进行详细的研究。
二、Ask模式
我们在上面的代码中,可以看到如下的消息传递方式:
sender() ! (x + magicNumber)
在这里,一个actor在receive函数中,向消息的源actor发送消息,使用tell(符号为:!)。这就是Tell模式,这个模式理解起来很简单,就是给别的actor发送一个消息,之后不阻塞,不记忆(事情没有发生过的样子)。没有等待消息回应的机制,接收到消息的ac