但是比较复杂的业务场景,就需要到调度引擎了,quartz就是一款优秀的调度引擎。
目前是试过两种spring版本的集成,1.5.9跟2.0.3版本,有所区别。
1.5的spring并没有提供专门的start启动类,所以很多东西都要自己手动写,而2.0提供有start,方便很多。
quartz工作原理:
由schedule来调度一个任务,而任务由trigger和jobdetail组成,jobdetail调用job来实现业务规则,借用一张图:
如图1
通常来讲,一个jobdetail和一个trigger是对应的,他们将设定同一个group名。trigger有简单trigger,也有cronTrigger,作用是指定触发规则(触发几次、间隔多少等)。而jobdetail用来指定一个job和部分调度规则,我们要把我们实现的业务规则写到job里面。jobdetail还有一个作用是给job传递一些参数(坑1:遗憾的是只有基础类型,你无法传递一个Object)。
坑2:很麻烦的是,schedule的生成并不参与spring的bean生命周期管理,这意味着你无法在job里写业务规则的时候使用@autowire!为此,spring提供了专门的工厂类来解决这个问题。
除此之外,quartz还未trigger、job、schedule提供了响应的监听器,让你可以对他们的生命周期做出响应的处理,比如说一个任务触发前该做什么,触发后/结束后该做什么。
如果你将quartz设置为持久化到数据库中,那么以上的设定都是可以持久化的(坑3:低版本quartz的job分为静态非静态,静态job的jobdetail数据无法持久化到库中),除了监听器。
想让监听器在服务重启后一样有效的解决方法也很简单,配置一个全局的监听类就可以了,在监听类中可以用group来区别不同的调度类型,做出不同的处理。
坑4:cron类型的触发和简单触发似乎完全区别开,简单触发可以指定触发次数,而cron规则不能指定次数,要指定触发次数,似乎只能手动计数,然后在监听器中手动停掉。
SpringBoot集成quartz的流程
最新推荐文章于 2024-09-27 15:02:18 发布