2017-09-05 455 views
0

我試圖在Java(很好,Groovy,真的)應用中使用新的Akka Timers API,當然使用Akka/Java API(我使用的Gradle座標是'com.typesafe.akka:akka-actor_2.11:2.5.4' )。當我試圖製作我的新的定時器股價的演員,我得到的編譯器錯誤:從Java API使用Akka AbstractActorWithTimers

class MyTimeAwareActor extends AbstractActorWithTimers { 
    @Override 
    void onReceive(Object message) { 
     if(message in StartNewTimer) { 
      timers.startPeriodicTimer(/* blah whatever */) 
     } 
    } 
} 

此代碼產生在我使用@Override註釋的編譯器錯誤:

的Groovy:方法從com.example.myapp.MyTimeAwareActor類的onReceive」不從它的超類或接口重寫方法,但都被註解@覆蓋。

這告訴我,我用這個演員不正確。我想要做的就是每當演員收到StartNewTimer消息時,啓動一個新的計時器(做些事情)。

任何想法我可以做到這一點,並解決這個編譯器錯誤?提前致謝!

回答

2

更換onReceivecreateReceive(以下是在Java中,你可以將其轉換爲Groovy中):

@Override 
public Receive createReceive() { 
    return receiveBuilder() 
     .match(StartNewTimer.class, message -> { 
      getTimers().startPeriodicTimer(/* blah whatever */); 
     }) 
     .build(); 
} 

onReceiveAbstractActorWithTimers或其父,AbstractActoronReceiveUntypedAbstractActor定義)定義。

+0

Thanks @chunjef(+1)我會在這裏稍微嘗試一下。好奇:這是定義演員的「新途徑」(通過'createReceive'而不是'onReceive')?如果是這樣,任何想法爲什麼我沒有在我的演員類中得到這個錯誤,只是擴展'UntypedActor'?再次感謝! – smeeb

+0

另外我還沒有忘記你上週對我的Akka/Timer問題的出色答案 - 在我可以測試你之前的建議之前,我需要做好這個工作,但是一旦我使所有的工作都能正常工作,問題! – smeeb

+0

@smeeb:是的,使用'AbstractActor'或者擴展它的類(如'AbstractActorWithTimers')並實現'createReceive'。對於擴展'UntypedActor'的actor,你不會得到同樣的錯誤,因爲'UntypedActor'確實有一個'onReceive'方法。不要使用'UntypedActor';它已被廢棄,如[這裏]所述(http://doc.akka.io/docs/akka/2.5/java/project/migration-guide-2.4.x-2.5.x.html#untypedactor)。 ('UntypedAbstractActor'是'UntypedActor'和'AbstractActor'之間的一個遷移橋。) – chunjef