Java 动态创建、删除定时任务

43 篇文章 0 订阅
25 篇文章 0 订阅

Java实现动态创建、删除定时任务

有何不妥,还请提出,共同进步

说明:这里只是提供简单方法,具体的实现以及任务的存储key值可以自定义

下面提供两种实现方法:
一、spring组件实现:

/**
 *         Spring组件实现实现动态创建、删除定时任务
 * @author Sentiment1996
 *
 */
public class ScheduledCreateTaskByCron {
         
        private static ThreadPoolTaskScheduler threadPoolTaskScheduler;
        /**
         *         任务存储中心
         */
    private static Map<String,ScheduledFuture<?>> futureMap = new HashMap<String, ScheduledFuture<?>>(); 
     
    static {
            threadPoolTaskScheduler=new ThreadPoolTaskScheduler();
            threadPoolTaskScheduler.setPoolSize(1000);
            threadPoolTaskScheduler.initialize();
    }
     
    /**
     *         创建定时任务
     * [url=home.php?mod=space&uid=952169]@Param[/url] className
     * @param cron
     */
    public static void createScheduled(String className,String cron) {
            if (futureMap.get(className) != null) {
                    stopScheduled(className);
        }
            futureMap.put(className, threadPoolTaskScheduler.schedule(getObjectClass(className), new CronTrigger(cron)));
    } 
     
    /**
     *         停止定时任务
     * @param className
     */
    public static void stopScheduled(String className) {
        if (futureMap.get(className) != null) {
                while(!futureMap.get(className).isDone()) {
                        break;
                }
                futureMap.get(className).cancel(true);
                futureMap.remove(className);
        }
    }
     
    /**
         *         动态创建对象
         * @param className
         * @return
         */
        private static Runnable getObjectClass(String className) {
                try {
                        return (Runnable) Class.forName(className).newInstance();
                } catch (InstantiationException e) {
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                } catch (NoClassDefFoundError e) {
                        e.printStackTrace();
                }
                return null;
        }
}

二、java组件

/**
 *         Java组件实现实现动态创建、删除定时任务
 * @author Sentiment1996
 *
 */
public class ScheduledCreateTaskByTimeUtil {
         
        private static ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
        /**
         *         任务存储中心
         */
        private static Map<String ,Object> map = new HashMap<String,Object>();
         
        static void init() {
                scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(100);
        }
         
        /**
         *         删除定时任务
         * @param className
         * @return
         */
        public static void removeScheduled(String className) {
                if(map.get(className)==null) {
                        return;
                }else{
                        scheduledThreadPoolExecutor.remove((Runnable) map.get(className));
                }
        }
         
        /**
         *         创建 / 更新定时任务
         * @param className
         * @param initialDelay
         * @param period
         * @param timeUnit
         */
        public static void createScheduled(String className,TaskFactory taskFactory) {
                if(scheduledThreadPoolExecutor==null) {
                        init();
                }
                removeScheduled(className);
                // 创建定时器
                ScheduledFuture<?> scheduledFuture = scheduledThreadPoolExecutor.scheduleWithFixedDelay(taskFactory, taskFactory.initialDelay, taskFactory.period, taskFactory.timeUnit);
                // 添加到map缓存器
                map.put(className,scheduledFuture);
        }
         
        /**
         *         初始化对象参数
         * @param taskFactory
         * @param initialDelay
         * @param period
         * @param timeUnit
         */
        public static TaskFactory initObjectParam(String className,String initialDelay,String period,String timeUnit) {
                // 创建对象
                TaskFactory taskFactory = getObjectClass(className);
                // 赋参
                taskFactory.initialDelay = Long.parseLong(initialDelay);
                taskFactory.period = Long.parseLong(period);
                taskFactory.timeUnit = getTimeUnit(timeUnit);
                return taskFactory;
        }
 
        /**
         *         获取TimeUnit对象
         * @param timeUnit
         * @return
         */
        private static TimeUnit getTimeUnit(String timeUnit) {
                switch(timeUnit) {
                case "days":
                        return TimeUnit.DAYS;
                case "hours":
                        return TimeUnit.HOURS;
                case "minutes":
                        return TimeUnit.MINUTES;
                case "seconds":
                        return TimeUnit.SECONDS;
                case "milliseconds":
                        return TimeUnit.MILLISECONDS;
                default:
                        return TimeUnit.MILLISECONDS;
                }
        }
 
        /**
         *         动态创建对象
         * @param className
         * @return
         */
        private static TaskFactory getObjectClass(String className) {
                try {
                        return (TaskFactory) Class.forName(className).newInstance();
                } catch (InstantiationException e) {
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                } catch (NoClassDefFoundError e) {
                        e.printStackTrace();
                }
                return null;
        }
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用`@EnableScheduling`注解启用定时任务功能,并使用`@Scheduled`注解来定义定时任务的执行规则。然而,这种方式在编译时就已经确定了定时任务的执行时间,无法实现动态创建和管理定时任务的需求。 要实现动态创建定时任务,可以借助`TaskScheduler`接口和`CronTrigger`类。下面是一个简单的示例: 首先,创建一个接口 `TaskSchedulerService`,定义动态创建删除定时任务的方法: ```java public interface TaskSchedulerService { void scheduleTask(String taskName, Runnable task, String cronExpression); void cancelTask(String taskName); } ``` 然后,创建一个实现类 `TaskSchedulerServiceImpl`,实现上述接口: ```java @Component public class TaskSchedulerServiceImpl implements TaskSchedulerService { @Autowired private ThreadPoolTaskScheduler taskScheduler; private Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>(); @Override public void scheduleTask(String taskName, Runnable task, String cronExpression) { ScheduledFuture<?> scheduledTask = taskScheduler.schedule(task, new CronTrigger(cronExpression)); scheduledTasks.put(taskName, scheduledTask); } @Override public void cancelTask(String taskName) { ScheduledFuture<?> scheduledTask = scheduledTasks.get(taskName); if (scheduledTask != null) { scheduledTask.cancel(true); scheduledTasks.remove(taskName); } } } ``` 在上述实现类中,我们使用了`ThreadPoolTaskScheduler`来执行定时任务,并通过`Map`来保存已经创建定时任务。 最后,在需要动态创建定时任务的地方,注入`TaskSchedulerService`,调用相应的方法即可: ```java @Autowired private TaskSchedulerService taskSchedulerService; public void createTask() { taskSchedulerService.scheduleTask("task1", () -> { // 定时任务逻辑 System.out.println("Task 1 executed!"); }, "0 * * * * *"); // 每分钟执行一次 } public void cancelTask() { taskSchedulerService.cancelTask("task1"); } ``` 通过上述方式,你可以动态创建删除定时任务,并根据需要指定不同的执行时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值