【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
如题,我在一个java web项目里需要做一个定时器,定时器的作用是每天凌晨零时把数据库上的某个表的某个字段的值设重置为0.
我在网上找了一些资料,按照http://blog.csdn.net/x6582026/article/details/52955159这个博客上的代码放到我的项目里(修改了时间)。启动项目后我修改我电脑的时间(本地测试,数据库、Tomcat都在本地)到当天23:59,等到了凌晨零时,但是发现数据库中的表的数据并没有被重置,控制台也没打印信息(修改数据库字段信息我设了打印信息的)。
求大神教教我怎么弄这个定时器。谢谢了!
因为是用Timer,建议阅读一下Timer的源码以及实现的机制(TimerThread)。概括的说一下原因,TimerThread的他并不是时时刻刻都在检查是否触发,而是在第一次检查之后,线程会wait一段时间(目前最近的一个task的触发时间减当前时间)。在线程开始wait之后,修改系统时间是不能让线程恢复执行的。所以你要测试的话,最好是先改系统时间,再启动项目。
一般系统定时任务的执行时间点应该避开时间变更操作(比如ntp对时服务执行时间点),统计类的定时任务也需要适当避开统计边界。
一般来说,这种需求需要考虑用quartz来实现会更合适,另外即使要用JDK原生类实现,也应该考虑使用ScheduledExecutorService而不是Timer(Timer内一旦发生未捕获异常,线程会退出,以后的定时任务都不会再执行);写个简单的Application,使用操作系统的定时任务来调用也是一种简单有效的方式。
create event event_test
on schedule EVERY 1 DAY STARTS '2016-11-23 00:00:00'
on completion preserve enable
do
update table set columna=0;
参考自: mysql 定时任务 event