使用Java将PoisonPill发送给Actor

问题描述 投票:9回答:3

我开始通过迁移现有的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());
java scala actor akka
3个回答
6
投票

请阅读Akka文档,我们花了很多时间创建它:

PoisonPill

您还可以向actor发送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编译它,看看是否有效。


6
投票

正如我在上面评论的回复中所提到的,这在Idea中或在使用gradle编译时不起作用。它实际上是编译错误,因为需要发送方ActorRef。我知道之前的答案都是旧的,我不确定这是否是api的变化,所以对于有类似问题的人你应该使用:

target.tell(PoisonPill.getInstance(), ActorRef.noSender());

供参考:http://doc.akka.io/docs/akka/snapshot/java/lambda-actors.html#PoisonPill


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)
© www.soinside.com 2019 - 2024. All rights reserved.