记录一次关于时间差的坑(导致看到定时器超前执行)
问题发现:
前提:
需求(涉及到定时器)完成后,部署到服务器上进行调试(数据库和服务位于不同的服务器上)
问题描述:
发现定时器在按照更新时间查找任务的时候会漏掉部分任务,导致相关的操作没有处理。
问题排查:
定时器部分:
定时器的部分处理逻辑:
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获取时间,这样就可以保证时间的一致性。