通用任务定时执行实现

Quartz触发器配置

从触发器中配置一个通用触发MainStarter



    

    
    
    


    
    
     

    

    
        
              
        
    

统一任务处理

MainStarter的实现

主要是任务中心来执行的

public class MainStarter{

    // 任务中心
    private TaskCenter taskCenter;
    
    public void setTaskCenter(TaskCenter taskCenter) {
        this.taskCenter = taskCenter;
    }

    public void run() {
        if(taskCenter==null) {
            taskCenter = new TaskCenterSupport();
        }
        taskCenter.run();
    }
}
public interface TaskCenter {
    // 加载任务
    public void loadTask(Task taskTracker);
    
    public List getTasks(); 
    
    public void run();
    
    public void terminate();
    
}

任务中心存储任务,任务 Task 为代码最终执行

public abstract class Task extends Thread {
    private boolean isAlive = true;

    @Override
    public void run() {
        while (isAlive) {
            try {
                doRun();
            } catch (Exception e) { 
                logger.error("run task error.", e);
            }
        }
    }

    public void setAlive(boolean isAlive) {
        this.isAlive = isAlive;
    }

    // 子类业务需要实现此方法,方法中为具体业务
    protected abstract void doRun() throws Exception;
}

具体业务实现

TaskCenter 的实现类 TaskCenterSupport

public class TaskCenterSupport implements TaskCenter {
    private List tasks;
    
    public List getTasks() {
        return tasks;
    }

    public void loadTask(Task task) {
        if (tasks == null) {
            tasks = new ArrayList<>();
        }
        
        tasks.add(task);
    }
    
    public void run() {
        if(CollectionUtils.isNotEmpty(tasks)){
            for (Task task : tasks) {
                if(task != null) {
                    task.setAlive(true);
                    task.start();
                }
            }
        }
    }
    
    public void terminate() {
        if(CollectionUtils.isNotEmpty(tasks)){
            for (Task task : tasks) {
                if(task != null) {
                    task.setAlive(false);
                }
            }
            
            tasks.clear();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                logger.error(e.getMessage(),e);
                Thread.currentThread().interrupt();
            }
        }
    }
}

Task 的子类 ZBTask

public class ZBTask extends Task{ 
    
    public ZBTask () {
        TaskCenter taskCenter = TaskCenterSingleton.getInstance();
        taskCenter.loadTask(this);
    }
    
    public void doRun() throws Exception {
        /* 具体业务实现,这里就能会定时执行,
         * 若有需要还可以在此使用休眠,
         * 这样只会把此线程挂起,不影响其他 Task 子类的执行
         */
    }

}

你可能感兴趣的:(通用任务定时执行实现)