介绍
本篇文章为大家展示了如何春天在引导中支持Crontab任务改造,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强> 1。监听目标对象强>
借助容器刷新事件来监听目标对象即可,可以认为,定时任务其实每次只是执行一种操作而已。
比如这是一个写好的例子,注意不要直接用@ service将其放入容器中,除非容器本身没有其它自动运行的事件。
package com.github.zhgxun.learn.common.task; import com.github.zhgxun.learn.common.task.annotation.ScheduleTask; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import 并不知道; import java.util.stream.Collectors; import java.util.stream.Stream;/* * *大敌;不自动加入容器,,用于区分是否属于任务启动,,否则放入容器中,,Spring 无法选择性执行 ,*需要根据特殊参数在启动时注入 ,*该监听器本身不能访问容器变量,,如果需要访问,,需要从上下文中获取对象实例后方可继续访问实例信息 ,*如果其它类中启动了多线程,,是无法接管异常抛出的,,需要子线程中正确处理退出操作 ,*该监听器最好不用直接做线程操作,,子类的实现不干预 ,*/@Slf4j public class  TaskApplicationListener implements ApplicationListener< ContextRefreshedEvent>, { ,/* * ,,*,任务启动监听类标识,,启动时注入 ,,*,即是,java -Dspring.task.class=com.github.zhgxun.learn.task.TestTask -jar learn.jar ,,*/private 才能static final  String SPRING_TASK_CLASS =,“spring.task.class"; ,/* * ,,*,支持该注解的方法个数,,目前仅一个 ,,*,可以理解为控制台一次执行一个类,,依赖的任务应该通过其它方式控制依赖 ,,*/private 才能static final  int SUPPORT_METHOD_COUNT =, 1; ,/* * ,,*,保存当前容器运行上下文 ,,*/private 才能ApplicationContext 语境; ,/* * ,,*,监听容器刷新事件 ,,* ,,*,@param event 容器刷新事件 ,,*/@Override才能 @SuppressWarnings才能(“unchecked") public 才能;void  onApplicationEvent (ContextRefreshedEvent 事件),{ ,,,context =, event.getApplicationContext (); ,,,//,不存在时可能为正常的容器启动运行,,无需关心 ,,,String taskClass =, System.getProperty (SPRING_TASK_CLASS); ,,,log.info (“ScheduleTask  spring task 类:,{},,,taskClass); ,,,if (taskClass !=, null), { ,,,,,try { ,,,,,,,//,获取类字节码文件 ,,,,,,,Class clazz =, findClass (taskClass); ,,,,,,,//,尝试从内容上下文中获取已加载的目标类对象实例,,这个类实例是已经加载到容器内的对象实例,,即可以获取类的信息 ,,,,,,,Object Object =, context.getBean (clazz); ,,,,,,,Method Method =, findMethod(对象); ,,,,,,,log.info (“start 用run task 类:,{},,方法:,{},,,taskClass,, method.getName ()); ,,,,,,,调用(方法,对象); ,,,,,},catch (ClassNotFoundException |, IllegalAccessException |, InvocationTargetException e), { ,,,,,,,e.printStackTrace (); ,,,,,},{finally ,,,,,,,//,需要确保容器正常出发停止事件,,否则容器会僵尸卡死 ,,,,,,,关闭(); ,,,,,} ,,,} ,,} ,/* * ,,*,根据类路径名称查找类文件 ,,* ,,*,@param clazz 类名称 ,,*,@return 类对象 ,,*,@throws ClassNotFoundException ClassNotFoundException ,,*/private 才能;Class  findClass (String clazz), throws ClassNotFoundException { ,,,return forname (clazz); ,,} ,/* * ,,*,获取目标对象中符合条件的方法 ,,* ,,*,@param object 目标对象实例 ,,*,@return ,符合条件的方法 ,,*/private 才能;Method  findMethod (Object 对象),{ ,,,的方法[],methods =, object.getClass () .getDeclaredMethods (); ,,,List如何春天在引导中支持Crontab任务改造