ThreadPoolTaskScheduler-定時任務動態配置執行

需求:同一個定時任務,可能會在不同的時間去執行,人工可以配置

 @Component
public class TimerTaskDynamicCron implements InitializingBean {
	
	 private static Logger logger = LoggerFactory.getLogger(TimerTaskDynamicCron.class);
	 
    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    @Autowired
    private RobotTimeTaskDao robotTimeTaskDao;
    
    private List<ScheduledFuture<?>> robotFutureList=new CopyOnWriteArrayList<ScheduledFuture<?>>();
 
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }
    
    /**
     * 項目啓動時就運行的
        或者用 @PostConstruct 這個標籤
     */
    @Override
	public void afterPropertiesSet() throws Exception {
    	List<RobotTimeTask> tasks = robotTimeTaskDao.findAll();
    	for(RobotTimeTask task:tasks){
    		startRobotTask(task);
    	}
	}
    
    /**
     * 開啓定時任務
     * @param task
     */
    public void startRobotTask(RobotTimeTask task) {
    	ScheduledFuture future = threadPoolTaskScheduler.schedule(new Runnable() {
			@Override
			public void run() {
				System.out.println("num::::::::"+task.getNum());
				logger.info("Task...........run..{}",task.getNum());
			}
		},new Trigger(){
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext){
            	//0/30 * * * * ?
            	CronTrigger trigger = new CronTrigger(task.getCron());
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        });
    	robotFutureList.add(future);
    }
    
    /**
     * 停止定時任務
     */
    public void stopRobotTask() {
        for(ScheduledFuture future:robotFutureList){
        	if (future != null) {
                //不會馬上停止任務,會等任務執行完 只是執行了interrupt方法
                future.cancel(true);
            }
        }
        robotFutureList.clear();
        logger.info("DynamicTask.stopTask()");
    }

}

模擬用戶從前臺修改定時:

@Service
public class TimerTaskDynamicService {
	 
	  @Autowired
	 private TimerTaskDynamicCron timerTaskDynamicCron;
	 
	 public void stopTask(){
        //先停止現有的定時
		 timerTaskDynamicCron.stopRobotTask();
		 
        //模擬新改的定時
		 List<RobotTimeTask> tasks=new ArrayList<RobotTimeTask>();
		 RobotTimeTask task1=new RobotTimeTask();
		 task1.setCron("0/5 * * * * ?");
		 task1.setNum(1);
		 
		 RobotTimeTask task2=new RobotTimeTask();
		 task2.setCron("0/10 * * * * ?");
		 task2.setNum(2);
		 
		 RobotTimeTask task3=new RobotTimeTask();
		 task3.setCron("0/15 * * * * ?");
		 task3.setNum(3);
		 
		 tasks.add(task1);tasks.add(task2);tasks.add(task3);
		 
		 for(RobotTimeTask task:tasks){
			 timerTaskDynamicCron.startRobotTask(task);
	     }
        //把舊的定時從數據庫刪除
        
        //再把新的task儲存到數據庫  以便下次啓動時  執行到最新的任務

	 }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章