2012-08-30 16 views
8

Estoy empezando a aprender Akka migrando una aplicación Java SE existente a él. Estoy usando Akka 2.0.3.Enviar un PoisonPill a un actor en Java

En un momento dado necesito enviar un PoisonPill a través de la cola de mensajes para detener a los actores. Mi actor se crea una instancia de este modo:

ActorRef myActor = actorSystem.actorOf(new Props(MyActor.class), "myActor"); 

a la que intento enviar el PoisonPill:

myActor.tell(PoisonPill.getInstance()); 

pero me da el siguiente error de compilación:

'tell(java.lang.Object)' in 'akka.actor.ActorRef' cannot be applied to '(akka.actor.PoisonPill$)' 

¿Qué estoy haciendo mal? Estoy ejecutando Java 1.6.0_26 en Idea (que también estoy aprendiendo después de toda una vida en Eclipse).


Editar:

También he intentado este enfoque, que se encuentra en la documentación, pero me sale el mismo error del compilador y la idea me advierte que la clase de Actores está en desuso.

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

+1 para el título de la pregunta. No tengo idea de qué se trata, pero se parece un poco a una escena de una película de suspenso o de terror :-) – Ridcully

+0

Eso es muy cierto, ¡nunca lo había leído así! Créame, en realidad soy una persona muy agradable en la vida real. – Rich

Respuesta

6

Lea la documentación Akka, hemos pasado mucho tiempo creándolo:

PoisonPill

You can also send an actor the akka.actor.PoisonPill message, which will stop the actor when the message is processed. PoisonPill is enqueued as ordinary messages and will be handled after messages that were already queued in the mailbox.

Use it like this:

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

El enfoque anterior es obsoleta desde 2.0.2 , esta es la nueva API:

ActorRef ref = system.actorOf(new Props(JavaAPITestActor.class)); 
ref.tell(PoisonPill.getInstance()); 

Lo anterior se compila en mi máquina, entonces ¿podría tener algún problema con IDEA? Intenta compilarlo con javac y ver si funciona.

+0

Lo siento, debería haber dicho, leí la documentación y lo intenté antes de hacer la pregunta, pero no solo recibo el mismo error de compilación, también me dicen que Actors está en desuso, por eso probé con la otra enfoque. Actualizaré mi respuesta. – Rich

+0

Genial, gracias, he editado mi respuesta para reflejar tanto la API obsoleta como la nueva. –

+0

¡He vuelto a Eclipse y compila bien! Supongo que podría ser un error en Idea, pero es más probable que yo haga algo mal en un IDE. No lo sé bien ... – Rich

4

Como mencioné en mi respuesta al comentario anterior, esto no funciona en Idea o al usar gradle para compilar. De hecho, es un error de compilación ya que se requiere el remitente ActorRef. Sé que las respuestas anteriores son viejos, y no estoy seguro de si esto fue un cambio en la API, por lo que para cualquier persona que tiene un problema similar que usted debe utilizar:

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

Para referencia, véase: http://doc.akka.io/docs/akka/snapshot/java/lambda-actors.html#PoisonPill

Cuestiones relacionadas