나는 다음과 같이 매일 작업을 실행하는 데 ScheduledExecutorService.scheduleAtFixedRate
를 사용정확도/JVM
executor.scheduleAtFixedRate(task, d, 24L * 3600 * 1000, TimeUnit.MILLISECONDS);
(d
는 밀리 초 초기 지연)입니다.
실행자는 Executors.newSingleThreadScheduledExecutor()
으로 생성되며 여러 작업을 실행하지만 모두 몇 시간 간격으로 예약되며 최대 몇 분이 소요됩니다.
나는 ScheduledExecutorService가 정확성에 대한 보장을하지 못한다는 것을 안다. 나는 그것을 얻기 위해 실시간 OS와 JVM이 필요하다. 그래도 그건 내 작업에 대한 요구 사항은 아닙니다.
Windows 2003 Server에서 JDK 1.7.0_03을 사용하면 작업이 하루에 거의 10 초씩 발생한다는 것을 알았습니다. 한 달에 약 5 분이 걸리는데, 이는 제 신청에 받아 들일 수 있습니다. 어쨌든 다시 스케쥴링을 구현해야 할 것입니다. 태스크를 특정 로컬 시간에 실행해야하기 때문에 DST를 직접 처리해야하기 때문입니다. 이 서비스는 오랜 기간 동안 실행됩니다. 다시 시작하지 않아도 반년은 그다지 특이하지 않습니다.
여전히 유휴 상태 시스템의 경우 10 초/일의 부정확도가 높다고 생각합니다. 더 나쁜 동작을 대비해야하는지 궁금합니다.
제 질문은 scheduleAtFixedRate
의 경험에 대한 것입니다. 10 초/일이 정상입니까? 다른 환경 (고객도 Linux 및 Solaris 서버 사용)에서 정확도가 더 좋거나 나 빠지게됩니까? 아니면 우리 환경에서 무언가가 잘못되었다는 표시가 10 초입니까?
참고 : '24L * 3600 * 1000, TimeUnit.MILLISECONDS'는'1, TimeUnit.DAYS'와 같습니다. 시간 단위 변환을 피하는 것이 전체 시간대입니다. – assylias
@assylias 예. 그러나 initialDelay d는 밀리 초 단위이며 하나의 TimeUnit 인수 만 있습니다. – Chris
Quartz 또는 Spring'task : scheduled-tasks'를 사용하여 특정 로컬 시간에 트리거 할 것이므로이 문제가 없습니다. – luukes