繁体   English   中英

Java Akka调度API抛出MissingMethodException

[英]Java Akka Scheduling API throwing MissingMethodException

在此处使用Akka com.typesafe.akka:akka-actor_2.11:2.5.4 Java 8(还是Groovy)。 我正在尝试创建一个演员( AppMaster ),该演员创建/拥有/管理另一个演员( StateChecker ),并计划每4秒向此StateChecker发送一条CheckState消息:

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。

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

您尝试使用的版本是以下方法

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不在乎谁StateChecker发送CheckState消息,那么最简单的解决方法是将null作为最后一个参数传递:

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

暂无
暂无

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

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