java web 的每天定时任务不反应

FrancisZhang 发布于 2016/11/11 13:51
阅读 1K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

如题,我在一个java web项目里需要做一个定时器,定时器的作用是每天凌晨零时把数据库上的某个表的某个字段的值设重置为0.

我在网上找了一些资料,按照http://blog.csdn.net/x6582026/article/details/52955159这个博客上的代码放到我的项目里(修改了时间)。启动项目后我修改我电脑的时间(本地测试,数据库、Tomcat都在本地)到当天23:59,等到了凌晨零时,但是发现数据库中的表的数据并没有被重置,控制台也没打印信息(修改数据库字段信息我设了打印信息的)。

求大神教教我怎么弄这个定时器。谢谢了!

加载中
0
小艺术家被占用了
本地测试,你把代码里触发时间设置成近点的时间,加个断点调试下。
FrancisZhang
FrancisZhang
把代码触发时间设置靠近本地时间是可以触发,但是把本地世间设置靠近代码触发世间他就不可以了。
0
长方体混凝土移动大师
长方体混凝土移动大师
不知道楼主用的是什么框架,我记得在Spring中有个定时器的设置,在你设置的时间触发即可,具体的你可以百度下,本地也是可以设置测试的。
长方体混凝土移动大师
长方体混凝土移动大师
回复 @FrancisZhang : 这样的话就那就得在考虑其他的了,我也坐等答案~
FrancisZhang
FrancisZhang
jsp+servlet+mybatis,没其他框架,项目比较小,就不想去集成那些框架了,很多用不到,麻烦。
0
逝水fox
逝水fox

因为是用Timer,建议阅读一下Timer的源码以及实现的机制(TimerThread)。概括的说一下原因,TimerThread的他并不是时时刻刻都在检查是否触发,而是在第一次检查之后,线程会wait一段时间(目前最近的一个task的触发时间减当前时间)。在线程开始wait之后,修改系统时间是不能让线程恢复执行的。所以你要测试的话,最好是先改系统时间,再启动项目。

一般系统定时任务的执行时间点应该避开时间变更操作(比如ntp对时服务执行时间点),统计类的定时任务也需要适当避开统计边界。

一般来说,这种需求需要考虑用quartz来实现会更合适,另外即使要用JDK原生类实现,也应该考虑使用ScheduledExecutorService而不是Timer(Timer内一旦发生未捕获异常,线程会退出,以后的定时任务都不会再执行);写个简单的Application,使用操作系统的定时任务来调用也是一种简单有效的方式。

0
ChangeZ
ChangeZ
有可能是你定时任务线程报异常了,你没有catch。就不会再执行了。
0
o
oneflower
不需要那么麻烦,在数据库中也可以做定时器来实现的:
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
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部