繁体   English   中英

使用Java将PoisonPill发送给Actor

[英]Sending a PoisonPill to an Actor in Java

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

请阅读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编译它,看看是否有效。

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

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

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

更新于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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM