spring-boot-2.0.3之quartz集成,最佳实践

  快过年了,大街上,爷爷在给孙子示范摔炮怎么放,嘴里还不停念叨:要像这样,用劲甩才能响。示范了一个,两个,三个...

  孙子终于忍不住了,抱着爷爷的腿哭起来:爷呀,你给我剩个吧!

spring-boot-2.0.3之quartz集成,最佳实践

  新的一年祝大家:健健康康,快快乐乐!

前情回顾与问题

  spring-boot-2.0.3之quartz集成,不是你想的那样哦! 讲到了quartz的基本概念,以及springboot与quartz的集成;集成非常简单,引入相关依赖即可,此时我们job存储方式采用的是jdbc。

  spring-boot-2.0.3之quartz集成,数据源问题,源码探究 讲到了quartz的数据源问题,如果我们没有@QuartzDataSource修饰的数据源,那么默认情况下就是我们的工程数据源,springboot会将工程数据源设置给quartz;为什么需要数据源,因为我们的job不会空跑,往往会进行数据库的操作,那么就会用到数据库连接,而获取数据库连接最常用的的方式就是从数据源获取。

  后续使用过程中,发现了一些问题:

    1、spring注入,job到底能不能注入到spring容器,job中能不能自动注入我们的mapper(spring的autowired);

    2、job存储方式,到底用JDBC还是MEMORY,最佳实践是什么

    3、调度失准,没有严格按照我们的cron配置进行

spring注入

  spring-boot-2.0.3之quartz集成,数据源问题,源码探究中我还分析的井井有条,并很自信的得出结论:job不能注入到spring,也不能享受spring的自动注入

spring-boot-2.0.3之quartz集成,最佳实践

  那时候采用的是从quartz数据源中获取connection,然后进行jdbc编程,发现jdbc用起来真的不舒服(不是说有问题,mybatis、spring jdbcTemplate等底层也是jdbc),此时我就有了一个疑问:quartz job真的不能注入到spring、不能享受spring的自动注入吗? 结论可想而知:能!

spring-boot-2.0.3之quartz集成,最佳实践

打的真疼

  job能不能注入到spring容器? 答案是可以的(各种注解:@Compoment、@Service、@Repository等),只是我们将job注入到spring容器有意义吗? 我们知道quartz是通过反射来实例化job的(具体实例化过程请往下看),与spring中已存在的job bean没有任何关联,我们将job注入到spring也只是使spring中多了一个没调用者的bean而已,没有任何意义。这个问题应该换个方式来问:job有必要注入到spring容器中吗? 很显然没必要。

  job中能不能注入spring中的常规bean了? 答案是可以的。我们先来看下是如何描述的:job可以定义setter来注入data map属性,也可以以类似的方式注入常规bean,如下所示

spring-boot-2.0.3之quartz集成,最佳实践

spring-boot-2.0.3之quartz集成,最佳实践

public class SampleJob extends QuartzJobBean { private MyService myService; private String name; // Inject "MyService" bean (注入spring 常规bean) public void setMyService(MyService myService) { ... } // Inject the "name" job data property (注入job data 属性) public void setName(String name) { ... } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { ... } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjxgw.html