【发布时间】:2017-07-04 06:25:32
【问题描述】:
我创建了一个 Web 侦听器,其中包含一个 ScheduledExecutorService 以在特定日期和时间运行作业,之后以固定的时间间隔运行。此调度程序检查特定日期和时间来完成这项工作。调度程序使用 UTC 时间。
问题是当我在我的本地主机上运行它时它工作得很好,但是当我把它放在远程服务器上时(服务器和我的本地主机不在同一个时区)它不能正常工作(它们产生不同的 System 值.currentTimeMillis() 。在记录器的帮助下,我检查了本地主机和服务器上 System.currentTimeMillis() 的值,它们是不同的。
这是我的调度程序。
private static ScheduledExecutorService execService = Executors.newScheduledThreadPool(1, namedThreadFactory);
final Calendar date = new GregorianCalendar();
date.setTimeZone(TimeZone.getTimeZone("UTC"));
execService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.info("Scheduler ran");
try {
if (date.get(Calendar.DAY_OF_MONTH) == 1) {
if (!(System.currentTimeMillis() - getStartTime().getTime() > 300000)) {
logger.info("Doing the job");
myJob();
}
else{
logger.info("Too late after scheduled time");
}
} else {
logger.info("Current Day of Month: " + date.get(Calendar.DAY_OF_MONTH) + ". Job will be done on 1st Day of the month");
}
} catch (Exception ex) {
logger.info(ex);
}
}
}, getInitialDelay(), (2*60000), TimeUnit.MILLISECONDS);
}
private static long getOffsetTime() {
Calendar dateForOffset = new GregorianCalendar();
dateForOffset.setTimeZone(TimeZone.getTimeZone("UTC"));
int days = dateForOffset.getActualMaximum(Calendar.DAY_OF_MONTH);
switch (days) {
case 31:
offsetTimeInMilli = PERIOD;
break;
case 29:
offsetTimeInMilli = (-1) * PERIOD;
break;
case 28:
offsetTimeInMilli = (-2) * PERIOD;
break;
default:
break;
}
return offsetTimeInMilli;
}
private static long getInitialDelay() {
long currentTime = System.currentTimeMillis();
logger.info( "Current Time " + currentTime);
logger.info("Set Time to do the job -->" + getStartTime().getTime() + " Milliseconds");
initialDelay = getStartTime().getTime() - currentTime;
logger.info("Initial Delay Found : " + initialDelay + " Milliseconds");
return initialDelay;
}
private static Date getStartTime() {
Calendar d10am = Calendar.getInstance();
d10am.setTimeZone(TimeZone.getTimeZone("UTC"));
//logger.info("Day of Month ----- >" + d10am.get(Calendar.DAY_OF_MONTH));
//d10am.set(Calendar.DAY_OF_MONTH, 1);
d10am.set(Calendar.HOUR_OF_DAY, 5);
d10am.set(Calendar.MINUTE, 55);
d10am.set(Calendar.SECOND, 0);
d10am.set(Calendar.MILLISECOND, 0);
d10am.get(Calendar.DAY_OF_MONTH);
//logger.info("Day of Month ----- >" + Calendar.DAY_OF_MONTH);
return d10am.getTime();
}
【问题讨论】:
-
但这意味着什么:它无法正常工作,我们如何帮助您对错误进行如此广泛的描述?跨度>
-
我已经编辑了这个问题。主要问题是调度程序给出了不同的 System.currentTimeMillis() 值,导致意外结果。
-
System.currentTimeMillis() 返回运行 JVM 的计算机的时间。为什么要在两个服务器中使用相同的值。你的实际问题是什么。
-
currentTimeMilli 的值是多少?我敢打赌,这只是几秒钟的事情。
-
本地主机上的时间是 1499150478841,服务器上的时间是 1499168889585
标签: ntp scheduledexecutorservice system-administration weblistener