All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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