Spring整合Quartz2.1.1(执行中,得到application上下文,执行bean方法)
2017-08-28 19:20
363 查看
==前文==,Quartz中迭代后,变化很大,让我走了很多的误区,这里简单解释一点,希望大家可以跳过误区,建议大家从下往上读(希望对大家有点帮助),我是一只爱分享的小菜鸟
JobDetail和Trigger和Schedule都是接口,统统不能new
1.如果只是执行一些自定义的类,其实使用SpringBoot的自带的任务就可以完成,简单的不能想象。这个可以看->我的另一篇SpringBoot原生定时任务解析。
2.如果要是要动态的执行一些有Spring管理的bean,可能要稍微费点功夫了,网上有很多的教程,那部分都是xml形式配置的,本人菜鸟一枚(十分迷惑),十分不喜欢xml配置,看着眼花,当程序读取的时候还是要解析java对象来执行的,那么为何不直接配置成配置类呢?这个问题先方下,以后会详细解释如何使用Spring Boot配置类。
上面的代码中看到这个JobExecutionContext可以得到JobDetail,而这个JobDetail对象是我们自己创建的用来详细介绍我们定时任务的,也就是我们要执行的方法的详细在这个里存放,
测试的bean对象
为了证明这个bean在上下文中,我们打印一下,上下文中的所有的bean
那么现在的任务就是把,这个上下文对象防盗JobDetil的map中,2.2.1的区别来了,不在是一起new的jobDetail了,由JobBuilder和TriggerBuilder构建
JobDetail和Trigger和Schedule都是接口,统统不能new
1.如果只是执行一些自定义的类,其实使用SpringBoot的自带的任务就可以完成,简单的不能想象。这个可以看->我的另一篇SpringBoot原生定时任务解析。
2.如果要是要动态的执行一些有Spring管理的bean,可能要稍微费点功夫了,网上有很多的教程,那部分都是xml形式配置的,本人菜鸟一枚(十分迷惑),十分不喜欢xml配置,看着眼花,当程序读取的时候还是要解析java对象来执行的,那么为何不直接配置成配置类呢?这个问题先方下,以后会详细解释如何使用Spring Boot配置类。
开始代码展示
//job是一个接口,当定时任务执行的时候,就要运行这个方法,那么可以推测 JobExecutionContext这个对象中包含了我们可能使用的关于这个定时任务的所有细节,请看代码 public interface Job { void execute(JobExecutionContext var1) throws JobExecutionException; } /** * Created by liuxin on 16/12/21. * 方案1:反射执行类和执行方法(不解析,没有用,刚开始走了误区,自己反射方法执行,大家尽量不要用) * 方案2:读取bean(这个才是重点) */ public class ScheduledTasks implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("------进入定时方法区域-------"); try { ConfigurableApplicationContext cac = (ConfigurableApplicationContext) jobExecutionContext.getJobDetail().getJobDataMap().get("ConfigurableApplicationContext"); HelloService helloService = (HelloService) cac.getBean("helloService"); helloService.hh(); } catch (Exception e) { } } }
上面的代码中看到这个JobExecutionContext可以得到JobDetail,而这个JobDetail对象是我们自己创建的用来详细介绍我们定时任务的,也就是我们要执行的方法的详细在这个里存放,
jobDetail.getJobDataMap().put("ConfigurableApplicationContext",cac); 这个是我们在main方法中测试时候,提前放进去,的在执行execute方法时候,取到的上下文对象,用来得到bean的这么说是不是很清楚了? 接着看代码
测试的bean对象
@Service public class HelloService { static int i=0; public void hh(){ System.out.println(++i); } }
为了证明这个bean在上下文中,我们打印一下,上下文中的所有的bean
@SpringBootApplication public class TestQuartzApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext cac = SpringApplication.run(TestQuartzApplication.class, args); String[] names = cac.getBeanDefinitionNames(); Arrays.asList(names).forEach(name -> System.out.println(name));//打印bean 可以看到helloService在倒数3 } } . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.2.RELEASE) org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.annotation.internalRequiredAnnotationProcessor org.springframework.context.annotation.internalCommonAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory testQuartzApplication org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor helloService redisConfig jedis
那么现在的任务就是把,这个上下文对象防盗JobDetil的map中,2.2.1的区别来了,不在是一起new的jobDetail了,由JobBuilder和TriggerBuilder构建
@SpringBootApplication @EnableScheduling public class TestQuartzApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext cac = SpringApplication.run(TestQuartzApplication.class, args); String[] names = cac.getBeanDefinitionNames(); Arrays.asList(names).forEach(name -> System.out.println(name));//打印bean SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(ScheduledTasks.class).withIdentity("testkey", "testvalue").withDescription("一个测试的类").build(); jobDetail.getJobDataMap().put("ConfigurableApplicationContext",cac);//重点是这句话 Trigger trigger = TriggerBuilder.newTrigger().startNow().withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).startNow().build(); scheduler.scheduleJob(jobDetail,trigger); scheduler.start(); } }
相关文章推荐
- Spring整合Quartz2.1.1(执行中,得到application上下文,执行bean方法)
- Spring之Bean实现了ApplicationContextAware等aware接口,对于setApplicationContext方法执行时间点的说明
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Spring 整合Quartz两种方式(JobDetailBean和MethodInvokingJobDetailFactoryBean方式)
- Quartz-Spring[一]之MethodInvokingJobDetailFactoryBean方法
- Quartz()整合Spring容器中bean及动态调度任务
- spring boot整合quartz实现多个定时任务的方法
- SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法
- Spring中初始化bean和销毁bean的时候执行某个方法的详解
- Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下
- 定时器quartz结合spring使用(方法二MethodInvokingJobDetailFactoryBean)
- Quartz学习(七)--Spring整合Quartz(JobDetailBean方式)
- Spring 的 ApplicationEvent and ApplicationListener 、spring框架加载完成后执行上下文刷新事件(ContextRefreshedEvent)
- Spring中初始化bean和销毁bean的时候执行某个方法的详解
- Spring整合Quartz实现定时任务调度的方法
- Spring中使用Quartz的2种方法(extends QuartzJobBean与使用MethodInvokingJobDetailFactoryBean)
- spring读取applicationContext.xml获得BeanFactory的方法
- SSH:解决Spring整合quartz定时任务执行两次问题