2017-09-16 7 views
0

Java 8 (bien, Groovy) en utilisant Akka com.typesafe.akka:akka-actor_2.11:2.5.4 ici. Je suis en train de créer un acteur (AppMaster) qui crée/possède/gère un autre acteur (StateChecker) et est prévu pour envoyer ce StateChecker un message CheckState toutes les 4 secondes:Java Akka Scheduling API jetant MissingMethodException

class CheckState {} 

class StateChecker extends AbstractActor { 
    // For this question, it really doesn't matter what this actor does 
} 

class AppMaster extends AbstractActor { 
    ActorRef stateChecker 

    @Override 
    Receive createReceive() { 
     receiveBuilder() 
      .match(Init, { message -> 
       stateChecker = context.actorOf(Props.create(StateChecker, "yes", 20), "state-checker") 

       FiniteDuration startDur = Duration.Zero() 

       FiniteDuration freqDur = Duration.create(4000, TimeUnit.MILLISECONDS) 
       CheckState checkState = new CheckState() 
       ExecutionContextExecutor executor = context.system().dispatcher() 

       context.system().scheduler().schedule(startDur, freqDur, stateChecker, checkState, 
       executor) 
      }) 
     .build() 
    } 
} 

Quand je lance ce que je reçois la exception suivante:

groovy.lang.MissingMethodException: No signature of method: akka.actor.LightArrayRevolverScheduler.schedule() is applicable for argument types: (scala.concurrent.duration.FiniteDuration, scala.concurrent.duration.FiniteDuration, akka.actor.LocalActorRef, com.me.myapp.messages.CheckState, akka.dispatch.Dispatcher) values: [0 days, 4000 milliseconds, Actor[akka://myapp/user/myapp-master/o1-keeper#-1837899613], ...] 
Possible solutions: schedule(scala.concurrent.duration.FiniteDuration, scala.concurrent.duration.FiniteDuration, java.lang.Runnable, scala.concurrent.ExecutionContext), schedule(scala.concurrent.duration.FiniteDuration, scala.concurrent.duration.FiniteDuration, scala.Function0, scala.concurrent.ExecutionContext), schedule(scala.concurrent.duration.FiniteDuration, scala.concurrent.duration.FiniteDuration, akka.actor.ActorRef, java.lang.Object, scala.concurrent.ExecutionContext, akka.actor.ActorRef) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:49) 

J'ajouté dans les états de journal et l'exception est levée pendant la programmation:

context.system().scheduler().schedule(startDur, freqDur, stateChecker, checkState, 
    executor) 

Une idée de ce que je dois faire pour résoudre ce problème? Puisqu'il s'agit d'un problème que j'ai avec l'API Java d'Akka, je do besoin de la réponse à être via l'API Java ... merci d'avance!

Répondre

1

Le problème est que les arguments que vous transmettez à la méthode schedule() ne correspondent à aucune des versions surchargées de cette méthode. Vous pouvez voir les signatures des versions surchargées de schedule() dans le JavaDoc.

La version que vous essayez d'utiliser est la method suivante:

Cancellable schedule(scala.concurrent.duration.FiniteDuration initialDelay, 
        scala.concurrent.duration.FiniteDuration interval, 
        ActorRef receiver, 
        java.lang.Object message, 
        scala.concurrent.ExecutionContext executor, 
        ActorRef sender) 

Vous êtes absent le dernier paramètre, qui est un ActorRef qui est désigné comme l'expéditeur du message prévu. Si StateChecker ne se soucie pas de qui il envoie le message CheckState, le correctif est plus facile de passer à null que ce dernier paramètre:

context.system() 
     .scheduler() 
     .schedule(startDur, freqDur, stateChecker, checkState, executor, null) 
                    //^
+0

vous devriez préférer 'Actor.noSender()' 'à null' – dfogni