Sentiment1996 发表于 2021-1-12 10:38

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

本帖最后由 Sentiment1996 于 2021-1-12 11:27 编辑

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

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


过几天更新:webMagic爬虫的几种情况演示

说明:这里只是提供简单方法,具体的实现以及任务的存储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();
    }
   
    /**
   *         创建定时任务
   * @Param 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;
      }
}

Sentiment1996 发表于 2021-1-12 11:18

图中的TaskFactory,这里只是演示,大家可以自行发挥

补充:Java :用到的参数在这里
spring用到的参数是cron表达式


class TaskFactory implements Runnable{
        // 初始化延时
        public long initialDelay;
        // 间隔执行时间
        public long period;
        // 时间颗粒度
        public TimeUnit timeUnit;
       
        @Override
        public void run() {
               
        }
}

class ATask extends TaskFactory {
        private String name = ATask.class.getName();
        @Override
        public void run() {
                //具体实现比如数据库表监控
        }
}

class BTask extends TaskFactory {
        private String name = BTask.class.getName();
        @Override
        public void run() {
                //具体实现比如服务状态监控
        }
}

Sentiment1996 发表于 2021-1-12 16:57

赵迎旭 发表于 2021-1-12 14:02
通过上传java文件的方式动态添加吗

如果你坚持已上传文件的方式动态添加,最好是弄成文件的形式,自己写一个读取文件内容的程序,每个一段时间读取一次指定目录,遍历文件读取添加,从而实现动态添加

或者我给你提供一种方案,自己写一个简易的前端界面,页面添加,后台直接调用即可,更方便

E式丶男孩 发表于 2021-1-12 11:00

这文章就很强势

781458905 发表于 2021-1-12 11:08

就是很强

hongvip666 发表于 2021-1-12 11:09

这有啥用...

Sentiment1996 发表于 2021-1-12 11:13

hongvip666 发表于 2021-1-12 11:09
这有啥用...

可以用数据库配置相关参数实现动态创建定时任务、更改

举例:比如运维监控系统,你可以配置监控的服务,让他自动创建定时任务、监控轮询服务状态。。。

还有很多,都是可以的,我这个只是说明了如何创建定时任务,具体的实现需要自己根据实际情况完成

fht000 发表于 2021-1-12 11:40

不是说爬虫吗?我还以为去网站上爬些链接什么的呢

euraka 发表于 2021-1-12 12:02

xxl不是更香吗,何必自己造轮子

tt0202 发表于 2021-1-12 13:54

很专业很强大

赵迎旭 发表于 2021-1-12 14:02

通过上传java文件的方式动态添加吗
页: [1] 2
查看完整版本: Java 动态创建、删除定时任务