吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2423|回复: 15
收起左侧

[Java 转载] Java 动态创建、删除定时任务

  [复制链接]
Sentiment1996 发表于 2021-1-12 10:38
本帖最后由 Sentiment1996 于 2021-1-12 11:27 编辑

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

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


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

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

下面提供两种实现方法:
一、spring组件实现:
[Java] 纯文本查看 复制代码
/**
 *         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] 纯文本查看 复制代码
/**
 *         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;
        }
}

免费评分

参与人数 4吾爱币 +8 热心值 +4 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
781458905 + 1 + 1 我很赞同!
zhczf + 1 + 1 我很赞同!
E式丶男孩 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Sentiment1996 发表于 2021-1-12 11:18
图中的TaskFactory,这里只是演示,大家可以自行发挥

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

[Java] 纯文本查看 复制代码
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

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

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

还有很多,都是可以的,我这个只是说明了如何创建定时任务,具体的实现需要自己根据实际情况完成
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文件的方式动态添加吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 23:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表