2017-09-16 68 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

相關問題