2013-01-03 5 views
3

나는 1 초마다 작업을 반복하는 간단한 스케줄러가에 : 불행하게도 모든 패스를 늦게 그래서 결국 배우가 정확히 100 밀리 나중에 TickMsg를받는 ticker-duration입니다Akka 스케줄러가() 말마다 반복

Cancellable task = Akka.system().scheduler().schedule(
     Duration.create(0, TimeUnit.MILLISECONDS), 
     Duration.create(1, TimeUnit.SECONDS), 
     actor, new TickMsg("Tick", 0, 120) 
); 

을 - 좋아, 즉, 문서에 설명 된 것 그것은 나에게 분명하다 : 그것은 정확한 시간에 작업을 실행하지 않습니다

하지만, 모든 틱에, 그것은 기한이 지난 모든 것을 실행됩니다. 모든 패스마다 1000MS가 1100ms를 필요로 대신 전달할 것을 의미 사실상 어느 늦은 이유를 이해할 수없는 무엇

이다. 결과 10 회 통과 후 1 초 지연 후 6 초, 1 시간 후 6 분 등 ...

일부 솔루션은 반복주기를 약간 짧게 설정하므로 필요한 틱에서 늦지 않았습니다 작품, 그리고 스케줄러가 같은 작업을 반복 예에 필요한 :

Cancellable task = Akka.system().scheduler().schedule(
     Duration.create(0, TimeUnit.MILLISECONDS), 
     Duration.create((1000 - tickerDuration/2), TimeUnit.MILLISECONDS), 
     actor, new TickMsg("Tick", 0, 120) 
); 

불행하게도이 방법이없이 작업 x 초마다 (또는 다른 TimeUnit)를 반복 할 다른 방법이 조금 불편하고 쉽게 잊어가있다 그것을 밀리 초로 변환하고 단축?

답변

5

이것은 Akka 버전 2.1에서 수정되었습니다.

이유는 매우 간단합니다. HashedWheelTimer는 반복되는 작업에 대해 알지 못하므로 작업 자체를 다시 예약해야하지만 틱 이후 정의에 의해 발생하기 때문에 항상 늦어지고 다음 버킷에 들어갑니다. 수정 사항에는 드리프트 보정이 포함되어 있습니다 (자세한 내용은 here 참조).

관련 문제