11

我开始通过将现有的 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(我也在 E​​clipse 中学习了一辈子)。


编辑:

我也尝试过文档中的这种方法,但是我得到了相同的编译器错误,并且 Idea 警告我 Actors 类已被弃用。

import static akka.actor.Actors.*;
extractionActor.tell(poisonPill());
4

3 回答 3

8

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

毒丸

您还可以向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 编译它,看看是否可行。

于 2012-08-30T13:08:54.757 回答
6

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

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

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

于 2015-10-29T21:35:11.980 回答
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)
于 2019-03-25T19:52:01.700 回答