timer.schedule(new GetTask(arg0.getServletContext()), 0,60*60*1000);,)
重新从获取数据就会又有1个小时以外的任务进来,这样就会 有两个 3个小时后运行 的任务,用timer.cancel();第一次可以,第二就报错,说你己经cancel()了 ...我现在的方法是,,从数据库里只获取一个小时己在的任务,这样就没有事了,但是我还是想获取所有的任务,,有没有办法,,以下是我的代码:(还有个问题是:我在GetTask 里面再生成任务, 有没有生命周期的问题?会不会不执行!!!!这个是重点,,,,请高手给我指定下。。。高手敬上>>>)
现在
public class TaskListener implements ServletContextListener {
private Timer timer= new Timer(true);
public void contextDestroyed(ServletContextEvent arg0) {
arg0.getServletContext().log("contextDestroyed");
timer.cancel();
}
public void contextInitialized(ServletContextEvent arg0) {
arg0.getServletContext().log("contextInitialized");
//一小时运行 一次 获取任务
timer.schedule(new GetTask(arg0.getServletContext()), 0,60*60*1000);
}
//从数据库里获取任务,并执行
public class GetTask extends TimerTask {
private ServletContext servletcontext ;
private HashMap<String,DBdate> TaskList;
public GetTask(ServletContext servletcontext)
{
this.servletcontext=servletcontext;
if(servletcontext.getAttribute("test")==null){
TaskList=new HashMap<String,DBdate>();
}else{
TaskList=(HashMap<String,DBdate>)servletcontext.getAttribute("test");
}
}
public void run() {
//从数据库中获取DBdate,并保存在servletcontext中
getTask();
System.out.println("获取任务后。。。。。。。。。。");
if(TaskList!=null && TaskList.size()>0){
System.out.println(TaskList.size());
while (TaskList.keySet().iterator().hasNext()) {
String key=(String)TaskList.keySet().iterator().next();
DBdate dbdate=(DBdate)TaskList.get(key);
timer.schedule(new DBTask(dbdate), dbdate.getEndTime());
}
}
}
public class DBTask extends TimerTask{
public DBTask(DBdate dbdate){
this.dbdate= dbdate;
}
public void run() {
// 执行我的业务逻辑
}
}
6 个解决方案
#1
说从数据库里获取的任务是要3个小时后运行 ,
GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
GetTask---(从数据库里获取的任务)一小时运行 一次 获取任务
说从数据库里获取的任务是要3个小时后运行 ;
3>1你认为逻辑通的过吗
GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
GetTask---(从数据库里获取的任务)一小时运行 一次 获取任务
说从数据库里获取的任务是要3个小时后运行 ;
3>1你认为逻辑通的过吗
#2
顶!你的逻辑问题@!
#3
学习一下
#4
不太明白要表达什么业务需求。
不管3小时后还是1小时后运行,你放在数据库里面呆着,n小时后再取不就好了
不管3小时后还是1小时后运行,你放在数据库里面呆着,n小时后再取不就好了
#5
没有说清楚,,我的意思,是每隔一小时去数据库取任务,,我的任务如下,,:
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
从数据库里取出这样的任务,,然后根据获取的时间再生成 任务 ,timer.schedule(new DBTask(dbdate), dbdate.getEndTime())
A任务每隔一小时到数据库里去提取所有的任务记录,,再根据任务记录生成N多个B任务去执行。。。
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
从数据库里取出这样的任务,,然后根据获取的时间再生成 任务 ,timer.schedule(new DBTask(dbdate), dbdate.getEndTime())
A任务每隔一小时到数据库里去提取所有的任务记录,,再根据任务记录生成N多个B任务去执行。。。
#6
问题在于,,我第一个小时 获取了
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
这些任务,,然后,timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 让他执行,,
但是是一个小时后再次获取任务时结果为
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
也就是他只会执行
2009-5-12 09:39:00 任务内容xxxx 第一条,,
然后,我再次timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 就会让再次执行后面四个,就重复了,,再过一个小时只要任务没有执行,就还能从数据库里取到,就还会再重复一次,最后时间到时结果就会变成。。(反复多次执行了。。)
2009-5-13 08:39:00 你执行了任务
2009-5-13 08:39:00 你执行了任务
。。。。
。。。
。。
。
我用timer.canel();方法就报错,。。。。
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
这些任务,,然后,timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 让他执行,,
但是是一个小时后再次获取任务时结果为
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
也就是他只会执行
2009-5-12 09:39:00 任务内容xxxx 第一条,,
然后,我再次timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 就会让再次执行后面四个,就重复了,,再过一个小时只要任务没有执行,就还能从数据库里取到,就还会再重复一次,最后时间到时结果就会变成。。(反复多次执行了。。)
2009-5-13 08:39:00 你执行了任务
2009-5-13 08:39:00 你执行了任务
。。。。
。。。
。。
。
我用timer.canel();方法就报错,。。。。
#1
说从数据库里获取的任务是要3个小时后运行 ,
GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
GetTask---(从数据库里获取的任务)一小时运行 一次 获取任务
说从数据库里获取的任务是要3个小时后运行 ;
3>1你认为逻辑通的过吗
GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
GetTask---(从数据库里获取的任务)一小时运行 一次 获取任务
说从数据库里获取的任务是要3个小时后运行 ;
3>1你认为逻辑通的过吗
#2
顶!你的逻辑问题@!
#3
学习一下
#4
不太明白要表达什么业务需求。
不管3小时后还是1小时后运行,你放在数据库里面呆着,n小时后再取不就好了
不管3小时后还是1小时后运行,你放在数据库里面呆着,n小时后再取不就好了
#5
没有说清楚,,我的意思,是每隔一小时去数据库取任务,,我的任务如下,,:
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
从数据库里取出这样的任务,,然后根据获取的时间再生成 任务 ,timer.schedule(new DBTask(dbdate), dbdate.getEndTime())
A任务每隔一小时到数据库里去提取所有的任务记录,,再根据任务记录生成N多个B任务去执行。。。
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
从数据库里取出这样的任务,,然后根据获取的时间再生成 任务 ,timer.schedule(new DBTask(dbdate), dbdate.getEndTime())
A任务每隔一小时到数据库里去提取所有的任务记录,,再根据任务记录生成N多个B任务去执行。。。
#6
问题在于,,我第一个小时 获取了
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
这些任务,,然后,timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 让他执行,,
但是是一个小时后再次获取任务时结果为
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
也就是他只会执行
2009-5-12 09:39:00 任务内容xxxx 第一条,,
然后,我再次timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 就会让再次执行后面四个,就重复了,,再过一个小时只要任务没有执行,就还能从数据库里取到,就还会再重复一次,最后时间到时结果就会变成。。(反复多次执行了。。)
2009-5-13 08:39:00 你执行了任务
2009-5-13 08:39:00 你执行了任务
。。。。
。。。
。。
。
我用timer.canel();方法就报错,。。。。
2009-5-12 09:39:00 任务内容xxxx
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
这些任务,,然后,timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 让他执行,,
但是是一个小时后再次获取任务时结果为
2009-5-12 10:39:00 任务内容xxxx
2009-5-13 08:39:00 任务内容xxxx
2009-5-14 10:01:00 任务内容xxxx
2009-5-15 22:22:00 任务内容xxxx
也就是他只会执行
2009-5-12 09:39:00 任务内容xxxx 第一条,,
然后,我再次timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 就会让再次执行后面四个,就重复了,,再过一个小时只要任务没有执行,就还能从数据库里取到,就还会再重复一次,最后时间到时结果就会变成。。(反复多次执行了。。)
2009-5-13 08:39:00 你执行了任务
2009-5-13 08:39:00 你执行了任务
。。。。
。。。
。。
。
我用timer.canel();方法就报错,。。。。