记录一次关于时间差的坑(导致看到定时器超前执行)

问题发现:

前提:

需求(涉及到定时器)完成后,部署到服务器上进行调试(数据库和服务位于不同的服务器上)

问题描述:

发现定时器在按照更新时间查找任务的时候会漏掉部分任务,导致相关的操作没有处理。

问题排查:

定时器部分:

记录一次关于时间差的坑(导致看到定时器超前执行)
定时器的部分处理逻辑:
1、获取当前时间 date
2、获取定时器的上一次执行时间
3、根据上一次定时器执行时间来执行定时任务
4、设置定时器的执行时间为date

业务处理部分:

业务处理时的新增/修改部分sql如下:
记录一次关于时间差的坑(导致看到定时器超前执行)
发现修改更新时间的方式为 updateTime=NOW()

在exectTime和updateTime的更新方式上,前者是使用的jdk获取的时间,而后者则是数据库的时间。刚好二者又不在同一服务器上, 时间不同,导致更新时间早于定时器执行时间的问题出现。正是如此,查询出现了记录遗漏的情况。

问题解决:

方案一:

将二者所在的服务器时间同步。具体方法请参考:
https://blog.csdn.net/qq32933432/article/details/102461086

优点:不需改动代码即可实现问题修复

缺点:不同的服务器都需要配置,不能起到一劳永逸的作用。

方案二:

修改sql,将updateTime=NOW()改为updateTime=date,date为jdk获取时间,这样就可以保证时间的一致性。

优点:更改后,不论服务与数据库时间是否一致,都不会再次出现此种问题。

缺点:需要改动代码,重新发布版本。