使用Java将PoisonPill发送给Actor

时间:2012-08-30 05:03:39

标签: java scala actor akka

我开始通过迁移现有的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());

3 个答案:

答案 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)