我开始通过迁移现有的Java SE应用程序来学习Akka。我正在使用Akka 2.0.3。
有一次,我需要通过消息队列发送PoisonPill来阻止演员。我的演员被实例化了:
ActorRef myActor = actorSystem.actorOf(new Props(MyActor.class), "myActor");
我尝试发送PoisonPill:
myActor.tell(PoisonPill.getInstance());
但是我得到以下编译器错误:
'tell(java.lang.Object)' in 'akka.actor.ActorRef' cannot be applied to '(akka.actor.PoisonPill$)'
我做错了什么?我在Idea中运行Java 1.6.0_26(我在Eclipse中一辈子都在学习)。
编辑:
我也尝试过这种方法,在文档中,但我得到了相同的编译器错误,并且Idea警告我不推荐使用Actors类。
import static akka.actor.Actors.*;
extractionActor.tell(poisonPill());
答案 0 :(得分:6)
请阅读Akka文档,我们花了很多时间创建它:
PoisonPill
您还可以向演员发送akka.actor.PoisonPill 消息,它将在处理消息时停止actor。 PoisonPill作为普通消息排队,并将在之后处理 已在邮箱中排队的邮件。
像这样使用:
import static akka.actor.Actors.*; myActor.tell(poisonPill());
上述方法自2.0.2以来已被弃用,这是新的API:
ActorRef ref = system.actorOf(new Props(JavaAPITestActor.class));
ref.tell(PoisonPill.getInstance());
以上编译在我的机器上,所以你可能在IDEA中遇到一些问题?尝试用javac编译它,看看是否有效。
答案 1 :(得分:5)
正如我在上面评论的回复中所提到的,这在Idea中或使用gradle编译时不起作用。它实际上是编译错误,因为需要发送方ActorRef。我知道以前的答案都是旧的,我不确定这是否是api的变化,所以对于任何有类似问题的人你都应该使用:
target.tell(PoisonPill.getInstance(), ActorRef.noSender());
参考:http://doc.akka.io/docs/akka/snapshot/java/lambda-actors.html#PoisonPill
答案 2 :(得分:0)
自25.03.2019更新
@Viktor Klang和@ yash.vyas的好答案有点过时了。这是Scala 2.12.8 和JDK8(1.8.0_172)的当前工作语法:
val accountB = context.actorOf(Props[BankAccount], "accountB")
accountB ! PoisonPill
您也可以写:
...
accountB ! PoisonPill.getInstance
tell-Method的默认调用也有效:
...
accountB.tell(PoisonPill.getInstance,ActorRef.noSender)