基于Spring的动态定时任务,可动态开启、关闭和取消任务

无配置文件实现动态定时任务,超级简单

定时任务抽象类ScheduleTask ,为具体的任务类提供了模板方法

/**
 * 定时任务抽象类(父类)
 * 具体执行方法请继承该类,然后重写run方法
 */
public abstract class ScheduleTask implements Runnable {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public ScheduleTask(String id) {
        this.id = id;
    }

    @Override
    public abstract void run();
}

工具类ScheduleUtil 。用于实现任务的开启、关闭、时间设置等操作

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

/**
 * 定时任务工具类
 *
 */
public class ScheduleUtil {
    private static final Log logger = LogFactory.getLog(ScheduleUtil.class);

    private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    private static Map<String, ScheduledFuture<?>> scheduledFutureMap = new HashMap<>();
    static{
        threadPoolTaskScheduler.initialize();
        logger.info("初始化线程池...");
    }
    /**
     * 启动某定时任务,到时间点就运行一次
     * @param scheduleTask
     * @param startTime
     */
    public static void start(ScheduleTask scheduleTask, Date startTime){
        if (isExist(scheduleTask.getId())){
            logger.info("启动定时任务"+ scheduleTask.getId()+"失败,任务已存在");
            return;
        }
        ScheduledFuture<?>scheduledFuture = threadPoolTaskScheduler.schedule(scheduleTask,startTime);
        scheduledFutureMap.put(scheduleTask.getId(),scheduledFuture);
        logger.info("启动定时任务"+ scheduleTask.getId()+",执行时间为"+ startTime);
    }

    /**
     * 启动某定时任务,以固定周期运行
     * @param scheduleTask
     * @param period
     */
    public static void start(ScheduleTask scheduleTask, long period){
        if (isExist(scheduleTask.getId())){
            logger.info("启动定时任务"+ scheduleTask.getId()+"失败,任务已存在");
            return;
        }
        ScheduledFuture<?>scheduledFuture = threadPoolTaskScheduler.scheduleAtFixedRate(scheduleTask,period);
        scheduledFutureMap.put(scheduleTask.getId(),scheduledFuture);
        logger.info("启动定时任务" + scheduleTask.getId() + ",执行周期为" + period + "毫秒");
    }

    /**
     * 取消某定时任务
     * @param scheduleTask*/
    public static void cancel(ScheduleTask scheduleTask){
        ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(scheduleTask.getId());
        if(scheduledFuture != null && !scheduledFuture.isCancelled()){
            scheduledFuture.cancel(false);
        }
        scheduledFutureMap.remove(scheduleTask.getId());
        logger.info("取消定时任务"+ scheduleTask.getId());
    }
    /**
     * 修改定时任务执行时间
     * @param scheduleTask
     * @param startTime
     */
    public static void reset(ScheduleTask scheduleTask,Date startTime){
        //先取消定时任务
        String id = scheduleTask.getId();
        ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(id);
        if(scheduledFuture != null && !scheduledFuture.isCancelled()){
            scheduledFuture.cancel(false);
        }
        scheduledFutureMap.remove(id);
        //然后启动新的定时任务
        scheduledFuture = threadPoolTaskScheduler.schedule(scheduleTask,startTime);
        scheduledFutureMap.put(id,scheduledFuture);
        logger.info("重置定时任务"+ id+",执行时间为"+ startTime);
    }

    /**
     * 判断某个定时任务是否存在或已经取消
     * @param id
     */
    public static Boolean isExist(String id) {
        ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(id);
        if (scheduledFuture != null && !scheduledFuture.isCancelled()) {
            return true;
        }
        return false;
    }
}

具体的任务类MyTask

import java.util.Date;

public class MyTask extends ScheduleTask {
    public MyTask(String id) {
        super(id);
    }

    @Override
    public void run() {
    	//todo Your operation
        System.out.println(new Date() + "任务" + this.getId() + "开始执行...hello world!");
    }
}

用法示例

import java.util.Date;

public class Main {
    public static void main(String[] args) throws Exception {
        //任务1
        ScheduleTask helloTask1 = new MyTask("task1");//new一个具体的执行任务
        ScheduleUtil.start(helloTask1, new Date(System.currentTimeMillis() + 5000));//5秒后执行一次
        ScheduleUtil.reset(helloTask1, new Date(System.currentTimeMillis() + 10000));//修改时间,10秒后执行

        //任务2
        ScheduleTask helloTask2 = new MyTask("task2");//new一个具体的执行任务
        ScheduleUtil.start(helloTask2, 2000);//每2秒执行一次
        Thread.sleep(5000);
        ScheduleUtil.cancel(helloTask2);//取消定时任务
    }
}


测试结果,如下图
在这里插入图片描述

本例无需其他任何配置,简单易用
需用到的包为:
commons-logging.jar
spring-beans
spring-context
spring-core

  • 12
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值