`
helloJ
  • 浏览: 164223 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

提问:JAVA操作定时任务

    博客分类:
  • java
阅读更多

首先,有一个XML里面,存放若干组以下内容:
1.定时任务执行的时间(或是周期或者某一时间);
2.数据库连接URL\用户名\密码
3.执行的SQL
需要按照指定的时间,在相映的数据库空中执行相映的SQL,当然这个简单.
问题是XML中的内容会被修改、删除、添加的!
如何保证在对XML修改、删除、添加后保证定时任务是按照更新后的XML中的信息执行的?
比如XML中有2组定时任务A组和B组。。。程序已经开始执行。这时我对B组的运行周期或SQL
修改的时候不影响A组的运行情况。。。并且最终B组是按照修改后的信息执行的!
请各位高手指点!急,急,急!

 

 

回答:

写了两个类.版主要是有耐心,就看一看,完善一下,应该可以用

package houlei.mission;

import java.io.Serializable;

/**
 * 该类是每个任务的封装Bean类.成员变量,应该是每个任务执行条件.<br>
 * 每个任务都应该有它的唯一标识符id,或者名字name也可以.其他的成员变量(像任务时间之类的),版主自己填写就可以了<br>
 * @author 侯磊
 */
public class Mission implements Serializable{

    private static final long serialVersionUID = 1L;
    private String id;
    private String SQL;

    public Mission(String id, String sql) {
        this.id = id;
        SQL = sql;
    }
    public boolean canExcute(){
        //这里添加任务可以执行的条件.一般是根据成员变量的内容,以及当前时间来决定返回值.
        return true;
    }
    public String getSQL() {
        return SQL;
    }

    public String getId() {
        return id;
    }
    
}

 

package houlei.mission;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 任务管理器的封装类型
 * @author 侯磊
 */
public class MissionManager {
    private Map missions = Collections.synchronizedMap(new HashMap());
    private File config;
    private CheckThread checker;
    public MissionManager(File config){
        this.config=config;
        checker= new CheckThread();
    }
    private void loadConfigFile(File config){
        
        //这里添加读取配置文件的代码.创建Mission对象
        //调用addMission方法更新missions的内容.
        //调用removeMission将配置文件中不存在的任务删除.
    }
    public void addMission(String id,Mission mission){
        //missions的Key存放Mission的id(字符串类型);Value存放Mission对象.
        missions.put(id,mission);
    }
    public void removeMission(String id){
        missions.remove(id);
    }
    public void startup(){
        checker.start();
    }
    public void shutdown(){
        checker.stop();
    }
    /**
     * 任务的执行器线程.用于执行任务.
     * @author 侯磊
     */
    private class ExcutorThread implements Runnable{
        private Mission mission;
        private Thread instance;
        private boolean running=false;
        public ExcutorThread(Mission mission) {
            this.mission = mission;
        }

        public void run() {
            //这里添加任务的执行代码.如果有循环结构,要注意条件中添加running变量
            mission.getSQL();//...
        }
        public void start(){
            if(running)return;
            running=true;
            instance = new Thread(this);
            instance.start();
        }
        public void stop(){
            if(running){
                running=false;
                instance.interrupt();
//                instance.join();
            }
        }
    }
    
    /**
     * 任务管理器的巡查线程.<br>
     * 用于检测配置文件是否变动,以及任务是否可以执行.
     * @author 侯磊
     */
    private class CheckThread implements Runnable{
        private long lastReadTime=0L;
        private Thread instance = new Thread(this);
        private boolean running=false;
        public void run() {
            while(running){
                //检查配置文件的时间.
                File file = new File(config.getAbsolutePath());
                if(file.lastModified()>lastReadTime){
                    loadConfigFile(file);
                    lastReadTime=file.lastModified();
                }
                //检查任务是否可以执行
                synchronized (missions) {
                    for(Iterator itr = missions.keySet().iterator();itr.hasNext()&&running;){
                        String id = itr.next().toString();
                        Mission mission = (Mission)missions.get(id);
                        if(mission.canExcute()){
                            new ExcutorThread(mission).start();
                        }
                    }
                }
                try {
                    Thread.sleep(1000);//巡查间隔
                } catch (InterruptedException e) { }
            }
        }
        public void start(){
            if(running)return;
            running=true;
            instance.start();
        }
        public void stop(){
            if(running){
                running=false;
                instance.interrupt();
//                instance.join();
            }
        }
    }
}

 

 

摘自:http://topic.csdn.net/u/20080617/09/41b931a2-52bc-4e64-ac07-dbaea5fe6fe5.html

分享到:
评论
2 楼 helloJ 2008-07-24  
只是转载下,有用到时做个参考,遇到问题解决不了,再网上找
1 楼 projector 2008-07-14  
你好,您要是能够再详细的讲解一下就好了。。。。

相关推荐

Global site tag (gtag.js) - Google Analytics