提問: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

發佈了17 篇原創文章 · 獲贊 0 · 訪問量 4011
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章