美文网首页Spring Boot实践记录
Spring整合Quartz2.1.1(执行中,得到applic

Spring整合Quartz2.1.1(执行中,得到applic

作者: Chinesszz | 来源:发表于2017-02-08 11:40 被阅读417次

    ==前文==,Quartz中迭代后,变化很大,让我走了很多的误区,这里简单解释一点,希望大家可以跳过误区,建议大家从下往上读(希望对大家有点帮助),我是一只爱分享的小菜鸟

    • 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(执行中,得到applic

      本文链接:https://www.haomeiwen.com/subject/fcpvittx.html