Akka的actor可以非常容易的实现本地或远程通信与方法调用。但对actor的调用方式直接决定了对actor接口返回的处理方式。不同的调用方式,对应不同的处理方式。
常规的actor调用方式:
actor ! message
这种以"!"号方式调用的actor,是真正的非阻塞式的异步模式,也就是不等待actor的响应,立即返回的模式。因此,如果直接获取该方式的返回结果,通常是得不到期望值的,而是空值。这种方式,与直接调用actor的tell方法一致。
而另一种调用方式:
actor ? message
也是异步调用,但有返回,而且可能携带期望回应的Future对象。与Await的result方法配合,就可以实现阻塞式的通讯。这种方式也就是ask模式。因此,在使用这种模式时,必须引入akka.pattern.ask包,否则actor ? message写法会被自动检测为非法的语法。
范例:
class LocalActor extends Actor with ActorLoggin {
implicit val timeout = Timeout(5 seconds) //必须引入scala.concurrent.duration._包
val remoteActor = context.actorSelection("akka.tcp://RemoteNodeApp@192.168.1.100:2558/user/remoteActor") //此处假设已经启动的远程actor为remoteActor