2017-09-16 7 views
0

Java 8(よく、Groovy)のAkkaを使用していますcom.typesafe.akka:akka-actor_2.11:2.5.4ここにあります。私が手に私はこれを実行するとJava Akka Scheduling API throw 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() 
    } 
} 

:私は/作成/は別の俳優(StateChecker)を管理所有しており、このStateCheckerCheckStateメッセージ4秒ごとに送信するために予定されている俳優(AppMaster)を作成しようとしています次の例外:

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()メソッドに渡す引数が、そのメソッドのオーバーロードされたバージョンと一致しないことです。オーバーロードされたバージョンschedule()の署名はJavaDocにあります。

あなたが使用しようとしているバージョンは、次の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

あなたはnull'なので 'に' Actor.noSenderを() '好む必要があります – dfogni

関連する問題