2012-04-03 3 views
2

NTP 서버를 사용하여 컴퓨터의 시스템 시계를 동기화 할 수 있음을 알고 있습니다. 하지만 NTP를 다른 시스템과 동기화하여 일정을 계획하려는 응용 프로그램에서 사용할 수 있습니까?Java 응용 프로그램에서 작업을 예약 할 때 NTP 서버를 사용하는 방법은 무엇입니까?

시나리오 : (아마도 Mule과 같은 ESB에서 실행되는) Java 앱을 개발하면 실행될 머신의 시간을 반드시 제어 할 수 없습니다. 앱이 NTP 서버를 사용하여 그 시간을 기준으로 실행할 작업을 예약 할 수 있습니까?

Quartz를 스케줄러로 사용하고 있다고 가정 해 보겠습니다. 시간을 처리하는 데 필요한 joda-time (유용한 경우). 시간은 매우 정확할 필요는 없으며 단지 원격 시스템보다 훨씬 앞서야합니다.

답변

0

다른 시스템과 동기화하여 일정을 예약하려는 응용 프로그램에서 NTP를 사용할 수 있습니까?

그런 식으로 사용되는 것을 들어 본 적이 없습니다. 그러나 Network Time Protocol (RFC 1305) 용 클라이언트를 구현하는 것을 막을 수있는 방법은 없습니다. 완전한 NTP 구현은 과잉 공격 일 수 있지만 SNTP 모드 (RFC 2030)의 프로토콜을 사용할 수도 있습니다.

높은 가용성과 합리적인 정확성을 원한다면 로컬 NTP 서버를 설정하여 사용하고 싶을 것입니다.

구글 검색

+0

그래,하지만 인기 히트 2004 년 이후 업데이 트되지 않았습니다. 여기에 관련된 StackOverflow 질문 : [Java NTP 클라이언트] (http://stackoverflow.com/questions/925191/java-ntp-client) –

0

내 직감은 NTP는 속도를 유지하기 위해 하드웨어 클럭 조정이 필요 하더군요 ... 거기에 자바 NTP 클라이언트의 수 있음을 나타냅니다. 따라서 하드웨어에 액세스 할 수 없다면 할 수 없습니다.

그러나 몇 초의 정밀도가 충분하면 서버에서 샘플 시간을 주기적으로 보내 시스템 클럭 간의 스큐를 계산하고 작업의 예약 된 시간을 조정할 수 있습니다.

2

드리프트에 대해 걱정하지 않고 기계가 무작위로 시간을 변경하는 것이 아니라고 가정하면 NTP 서버를 핑 (ping)하여 IT가 생각하는 시간을 얻고 그 시간과 비교할 수 있습니다. 로컬 시스템은 그것이 있다고 생각하고 차이를 계산 한 다음 현지 시간에 작업을 예약합니다.

예를 들어, NTP 서버가 12시 30 분이라고 말하면 로컬 컴퓨터는 12시 25 분이라고 말합니다. 그리고 당신은 13:00 NTP 시간에 당신의 업무가 끝나길 원합니다.

12:25 - 12:30 = -0 : 05. 13:00 + (-0 : 05) = 12:55이므로 12:55에 작업을 예약하십시오.

부칙은 -

내가 구현의 순진함으로 말할 수 없다, 나는 프로토콜에 충분히 익숙하지 않다.

결국 실용적인 정확도의 수준이 받아 들여질 수 있습니다. NTP는 시스템 간의 시간을 동기화하는 데 사용됩니다. 문제의 해결 방법 중 하나는 지속적으로 호출하는 것입니다. "NTP Ping, offset with schedule"기법을 사용하고 미래의 시간이 미래의 8 시간이라면 클럭 크립이 발생할 가능성이 매우 높습니다. 즉, 작업이 " 12시 55 분 ", 12시 55 분 롤 때, 그것은 시계가 전혀 동기화되지 않았기 때문에 원래 NTP 서버에서 벗어날 수 있으며, 작업은 거의 재 동기화로 다시 스케줄되지 않았습니다.

원래 일정과 실제 실행 사이의 기간이 길어질수록 분명히 표류 할 가능성이 커집니다. 이것은 원본 NTP 핑이 얼마나 좋은지 상관없이 아티팩트입니다. 드리프트를 보상하기 위해 실행 시간에 가까워 질 때 이러한 작업을 다시 스케줄 할 계획이 없다면 NTP의 "합리적인"구현이 적합 할 것입니다.

NTP 클라이언트가있는 Apache Commons NET 라이브러리가 있습니다. 어떤 사람들은 Windows에서 해상도 문제 (10-15ms)가있는 System.currentTimeMillis()를 사용한다고 불평합니다. System.nanoTime은이 문제를 해결하고이를 사용하기 위해 라이브러리를 쉽게 변경하고 다시 작성할 수 있습니다.

구현의 "순진함"을 어떻게 반영하는지는 말할 수 없습니다. 그러나 결국에는 두 시스템과 작업 (가상)을 동기화 상태로 유지하는 데 얼마나 긴밀한 관계가 필요합니다.

+0

오른쪽. 그렇다면 "IT가 생각하는 시간을 얻기 위해 NTP 서버를 핑 (ping)하는"좋은 방법은 무엇입니까? 나는 옛날 "순진한"[자바 SNTP 클라이언트] (http://support.ntp.org/bin/view/Support/JavaSntpClient)를 보았지만 뭔가 다른 것이있을 것이라고 생각했다. 그 부분). –

+0

나는 주위를 둘러 보았고 더 새로운 자바 라이브러리를 발견했다 : [AtomicDate] (http://atomicdate.sourceforge.net/) 아직 문서를보기 위해 그것을 뽑지 않았다. –