2017-09-16 67 views
0

Java 8(以及Groovy)在这里使用Akka com.typesafe.akka:akka-actor_2.11:2.5.4。我试图创建一个用于创建/拥有/管理的另一位演员(StateChecker),预计发送每4秒这StateChecker一个CheckState消息的演员(AppMaster):Java Akka Scheduling API抛出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() 
    } 
} 

当我运行此我得到的以下情况除外:

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) 

我的日志报表,并将调度过程中的异常被抛出:

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

任何想法我需要做什么来解决这个问题?由于这是我与Akka的Java API有关的问题,我需要通过Java API的答案 ...提前致谢!

回答

1

问题是您传递给schedule()方法的参数不匹配该方法的任何重载版本。您可以在JavaDoc中看到schedule()的重载版本的签名。

您正在尝试使用的版本是以下method

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

你错过了最后一个参数,它是被指定为计划的邮件的发件人的ActorRef。如果StateChecker不在乎谁把它CheckState消息,那么最简单的解决方法是在null传递,因为这最后一个参数:

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

你应该更喜欢'Actor.noSender()''来null' – dfogni

相关问题