
com.undefinedlabs.scope.clock.NtpClock Maven / Gradle / Ivy
package com.undefinedlabs.scope.clock;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
import com.undefinedlabs.scope.logger.ScopeLogger;
import com.undefinedlabs.scope.logger.ScopeLoggerResolver;
import java.net.InetAddress;
public class NtpClock implements Clock {
private static final ScopeLogger LOGGER = ScopeLoggerResolver.INSTANCE.get();
private static final String NTP_URL = "pool.ntp.org";
private final SystemClock systemClock;
private final long offset;
public NtpClock() {
systemClock = new SystemClock();
offset = calculateOffset(NTP_URL);
}
@Override
public long currentTimeMicros() {
return systemClock.currentTimeMicros() + (offset * 1_000);
}
@Override
public long currentNanoTicks() {
return systemClock.currentNanoTicks() + (offset * 1_000_000);
}
@Override
public boolean isMicrosAccurate() {
return false;
}
private long calculateOffset(final String ntpUrl) {
final NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(5000);
try {
client.open();
final TimeInfo timeInfo = client.getTime(InetAddress.getByName(ntpUrl));
timeInfo.computeDetails();
return timeInfo.getOffset() != null ? timeInfo.getOffset() : 0L;
} catch (final Exception e) {
LOGGER.warn("Could not determine time offset using NTP: " + e.getMessage());
return 0L;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy