diff --git a/oh-my-scheduler-server/pom.xml b/oh-my-scheduler-server/pom.xml
index ad79c368..ffad5f2f 100644
--- a/oh-my-scheduler-server/pom.xml
+++ b/oh-my-scheduler-server/pom.xml
@@ -22,6 +22,7 @@
2.5.2
5.7.0.202003110725-r
3.0.1
+ 3.6
true
@@ -107,6 +108,13 @@
${jgit.version}
+
+
+ commons-net
+ commons-net
+ ${commons.net.version}
+
+
org.apache.maven.shared
diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/OhMyServer.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/OhMyServer.java
index 02a1cb21..6e4c1054 100644
--- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/OhMyServer.java
+++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/OhMyServer.java
@@ -8,6 +8,7 @@ import com.github.kfcfans.oms.common.utils.NetUtils;
import com.github.kfcfans.oms.server.akka.actors.FriendActor;
import com.github.kfcfans.oms.server.akka.actors.ServerActor;
import com.github.kfcfans.oms.server.common.utils.PropertyUtils;
+import com.github.kfcfans.oms.server.common.utils.TimeUtils;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Maps;
import com.typesafe.config.Config;
@@ -38,6 +39,8 @@ public class OhMyServer {
Stopwatch stopwatch = Stopwatch.createStarted();
log.info("[OhMyServer] OhMyServer's akka system start to bootstrap...");
+ TimeUtils.check();
+
// 解析配置文件
PropertyUtils.init();
Properties properties = PropertyUtils.getProperties();
diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/utils/TimeUtils.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/utils/TimeUtils.java
new file mode 100644
index 00000000..67ac5ca2
--- /dev/null
+++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/common/utils/TimeUtils.java
@@ -0,0 +1,63 @@
+package com.github.kfcfans.oms.server.common.utils;
+
+import com.github.kfcfans.oms.common.RemoteConstant;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.net.ntp.NTPUDPClient;
+import org.apache.commons.net.ntp.NtpV3Packet;
+import org.apache.commons.net.ntp.TimeInfo;
+
+import java.net.InetAddress;
+import java.util.List;
+
+/**
+ * 时间工具
+ *
+ * @author tjq
+ * @since 2020/5/19
+ */
+@Slf4j
+public class TimeUtils {
+
+ // NTP 授时服务器(阿里云 -> 交大 -> 水果)
+ private static final List NTP_SERVER_LIST = Lists.newArrayList("ntp.aliyun.com", "ntp.sjtu.edu.cn", "time1.apple.com");
+ // 最大误差 5S
+ private static final long MAX_OFFSET = 5000;
+
+ public static void check() throws TimeCheckException {
+
+ NTPUDPClient timeClient = new NTPUDPClient();
+ timeClient.setDefaultTimeout((int) RemoteConstant.DEFAULT_TIMEOUT_MS);
+
+ for (String address : NTP_SERVER_LIST) {
+ try {
+ TimeInfo t = timeClient.getTime(InetAddress.getByName(address));
+ NtpV3Packet ntpV3Packet = t.getMessage();
+ log.info("[TimeUtils] use ntp server: {}, request result: {}", address, ntpV3Packet);
+ // RFC-1305标准:https://tools.ietf.org/html/rfc1305
+ // 忽略传输误差吧...也就几十毫秒的事(阿里云给力啊!)
+ long local = System.currentTimeMillis();
+ long ntp = ntpV3Packet.getTransmitTimeStamp().getTime();
+ long offset = local - ntp;
+ if (Math.abs(offset) > MAX_OFFSET) {
+ String msg = String.format("inaccurate server time(local:%d, ntp:%d), please use ntp update to calibration time", local, ntp);
+ throw new TimeCheckException(msg);
+ }
+ return;
+ }catch (Exception ignore) {
+ log.warn("[TimeUtils] ntp server: {} may down!", address);
+ }
+ }
+
+ throw new TimeCheckException("no available ntp server, maybe alibaba, sjtu and apple are both collapse");
+ }
+
+ public static final class TimeCheckException extends RuntimeException {
+ public TimeCheckException(String message) {
+ super(message);
+ }
+ public TimeCheckException(Throwable cause) {
+ super(cause);
+ }
+ }
+}
diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java
index f3bdf4f6..896ba4dc 100644
--- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java
+++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java
@@ -151,7 +151,9 @@ public class ContainerService {
// 将文件拷贝到正确的路径
String finalFileStr = OmsFileUtils.genContainerJarPath() + fileName;
File finalFile = new File(finalFileStr);
- FileUtils.forceDelete(finalFile);
+ if (finalFile.exists()) {
+ FileUtils.forceDelete(finalFile);
+ }
FileUtils.moveFile(tmpFile, finalFile);
return md5;
diff --git a/oh-my-scheduler-worker/src/main/java/com/github/kfcfans/oms/worker/common/utils/SerializerUtils.java b/oh-my-scheduler-worker/src/main/java/com/github/kfcfans/oms/worker/common/utils/SerializerUtils.java
index 99248566..3bb982fb 100644
--- a/oh-my-scheduler-worker/src/main/java/com/github/kfcfans/oms/worker/common/utils/SerializerUtils.java
+++ b/oh-my-scheduler-worker/src/main/java/com/github/kfcfans/oms/worker/common/utils/SerializerUtils.java
@@ -4,7 +4,6 @@ package com.github.kfcfans.oms.worker.common.utils;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
-import com.esotericsoftware.kryo.util.Pool;
/**
* 序列化器