通过定时从数据库里获取任务,然后根据不同任务的执行时间 来执行业务逻辑,,以下是我的代码:(但是在运行的时候,有这种情况就会不对,比如说从数据库里获取的任务是要3个小时后运行 ,GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
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() {
//  执行我的业务逻辑
}
}

解决方案 »

  1.   

    说从数据库里获取的任务是要3个小时后运行 ,
    GetTask类里我把所有的任务都timer.schedule(new DBTask(dbdate), dbdate.getEndTime()) 了,,,然后一个小时后,再次执行 //一小时运行 一次 获取任务
    GetTask---(从数据库里获取的任务)一小时运行 一次 获取任务
    说从数据库里获取的任务是要3个小时后运行 ;
    3>1你认为逻辑通的过吗
      

  2.   

    没有说清楚,,我的意思,是每隔一小时去数据库取任务,,我的任务如下,,:
    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任务去执行
      

  3.   

    问题在于,,我第一个小时 获取了
    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();方法就报错,。