我用jsp+servlet+mysql
搞了一个众筹网站。当一个项目发起后,它有一个众筹时间,过了这个时间,项目就会从众筹状态转到另一个状态,当然,这需要在数据库中去操作。那么,如何设计一个计时器,在规定时间将触发,去更改相应的数据库表呢?
我用jsp+servlet+mysql
搞了一个众筹网站。当一个项目发起后,它有一个众筹时间,过了这个时间,项目就会从众筹状态转到另一个状态,当然,这需要在数据库中去操作。那么,如何设计一个计时器,在规定时间将触发,去更改相应的数据库表呢?
楼上提到java.util.Timer
如果要使用,题主需要注意这种情况
public class BadCaseOfTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new ThrowTask(),1);
timer.schedule(new ThrowTask(),1);
}
static class ThrowTask extends TimerTask{
@Override
public void run() {
System.out.println("runnin.."+System.currentTimeMillis());
throw new RuntimeException();
}
}
}
有一个问题
时间到了以后,从一个状态转到另一个状态,除了改变这个字段的值以外,还有其它需要触发进行的操作么?
如果没有,很可能你不需要一个定时任务。
只需要在数据库中记录项目发起时间和期限,在需要判断状态的时候根据这两个值和当前时间,决定项目的状态。
类似于你的网站里记录用户的生日信息,在页面显示用户年龄。我想没有人会真的在数据库保存年龄然后每天刷新的。
不需要定时任务,只要设置开始结束时间,在所需的业务逻辑处判断即可:
1、筛选正在众筹的列表,sql添加条件:
startTime > now() AND endTime < now()
2、区分状态,在model中通过判断时间来转义称状态:
public class Item{
private Date startTime;
private Date endTime;
public String getStatus(){
if(startTime != null && endTime != null){
Date now = new Date();
if(now.after(startTime) && now.before(endTime)){
return "正在众筹中";
}else if(now.before(startTime)){
return "还未开始";
}else if(now.after(endTime)){
return "已结束";
}
}
return "";
}
...
}
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
2 回答2.8k 阅读✓ 已解决
Spring+quartz 做定时任务