如何春天在引导中支持Crontab任务改造

  介绍

本篇文章为大家展示了如何春天在引导中支持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任务改造