前情描述:系统云部署,时间标识放在Nacos配置中心,微服务通过@Value标识获取设置的String类型的时间。代码大致如下:
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public Long getProjectStartDate() {
try {
Date date = sdf.parse(projectStartTime);
Long startTimes = date.getTime();
System.out.println("----projectStartTime----"+projectStartTime+"-----转化----"+startTimes);
} catch (ParseException e) {
//获取服务启动时间
return defaultStartTimestamp;
}
}
定时任务,此方法5分钟执行一次(重要!!!)。
诡异的问题出现了:系统正常运行两个月,突然跳帧,startTimes返回一个错误的时间,定时任务第二个五分钟执行又正常了。反复检查,通过一步步打印日志定位发现是date.getTime()出现问题,不定时的返回不同的错误时间(偶然时间,随机的错误时间)。
正常情况下,@Value获取的时间是在缓存中存放的,执行过之后,不会存在错误;查阅发现我定义的static变量SimpleDateFormat线程不安全,有一定的概率出现转化错误的情况。
解决方案:1、不要定义为static变量,使用局部变量。2、使用DateTimeFormatter代替SimpleDateFormat。3、第一次执行时,把转换后的startTimes放在缓存中,之后每次读取缓存中的数据。