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储存到数据库  以便下次启动时  执行到最新的任务

	 }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadPoolTaskScheduler 是 Spring 框架中提供的一个线程池定时任务调度器,可以在预定的时间间隔或固定的时间执行任务。它可以用于执行异步任务,如发送邮件或者短信,定时从数据库或者第三方接口获取数据等。 ThreadPoolTaskScheduler 可以通过配置线程池的大小来控制并发执行任务的数量,从而避免系统资源浪费。它也提供了一些方法来控制定时任务执行,如取消任务、暂停任务、恢复任务等。 下面是一个使用 ThreadPoolTaskScheduler 调度定时任务的示例: 首先,需要在 Spring 配置文件中配置 ThreadPoolTaskScheduler 和定时任务: ```xml <bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> <property name="poolSize" value="5"/> </bean> <bean id="myTask" class="com.example.MyTask"/> <task:scheduled-tasks> <task:scheduled ref="myTask" method="run" fixed-delay="5000"/> </task:scheduled-tasks> ``` 其中,taskScheduler 配置了线程池大小为 5,myTask 是一个实现了 Runnable 接口的类,run 方法是定时任务执行的方法,fixed-delay 属性表示每隔 5 秒执行一次。 接着,在 MyTask 类中实现 run 方法: ```java public class MyTask implements Runnable { @Override public void run() { // 执行定时任务的逻辑 System.out.println("定时任务执行了!"); } } ``` 这样就可以使用 ThreadPoolTaskScheduler 定时执行 MyTask 中的 run 方法了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值