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;
}
} 图中的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() {
//具体实现比如服务状态监控
}
} 赵迎旭 发表于 2021-1-12 14:02
通过上传java文件的方式动态添加吗
如果你坚持已上传文件的方式动态添加,最好是弄成文件的形式,自己写一个读取文件内容的程序,每个一段时间读取一次指定目录,遍历文件读取添加,从而实现动态添加
或者我给你提供一种方案,自己写一个简易的前端界面,页面添加,后台直接调用即可,更方便 这文章就很强势 就是很强 这有啥用... hongvip666 发表于 2021-1-12 11:09
这有啥用...
可以用数据库配置相关参数实现动态创建定时任务、更改
举例:比如运维监控系统,你可以配置监控的服务,让他自动创建定时任务、监控轮询服务状态。。。
还有很多,都是可以的,我这个只是说明了如何创建定时任务,具体的实现需要自己根据实际情况完成 不是说爬虫吗?我还以为去网站上爬些链接什么的呢 xxl不是更香吗,何必自己造轮子 很专业很强大 通过上传java文件的方式动态添加吗
页:
[1]
2