如何解决spring-boot-starter-quartz 实现作业 vs 扩展 QuartzJobBean
我在我的一个项目中使用 Quartz Scheduler。创建 Quartz 作业有两种主要方式:
- 实现
org.quartz.Job
类 - 扩展
org.springframework.scheduling.quartz.QuartzJobBean
(实现 org.quartz.Job 类)
QuartzJobBean javadoc 的最后一部分令人困惑:
* Note that the preferred way to apply dependency injection to Job instances is via a JobFactory:
that is,to specify SpringBeanJobFactory as Quartz JobFactory (typically via
SchedulerFactoryBean.setJobFactory SchedulerFactoryBean's "jobFactory" property}).
This allows to implement dependency-injected Quartz Jobs without a dependency on Spring base classes.*
对于纯 Spring(或 SpringBoot)使用,我认为最好扩展 QuartzJobBean。我是对的?
解决方法
首先,由于 QuartzJobBean
是 Job
,任何接受 Job
的 API 调用都将接受 QuartzJobBean
,但反之则不然。因此,如果您需要一个 QuartzJobBean
,因为某些 API 调用希望您将其传递给一个,那么这就是您的答案。
否则,答案取决于您是否想要使用(并绑定到)QuartzJobBean
提供的功能。如果您查看该类的源代码,您会发现将 QuartzJobBean
子类化而不是实现 Job
的唯一好处是 QuartzJobBean
在将控制权传递给您的代码之前执行此逻辑:
try {
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValues(context.getScheduler().getContext());
pvs.addPropertyValues(context.getMergedJobDataMap());
bw.setPropertyValues(pvs,true);
}
catch (SchedulerException ex) {
throw new JobExecutionException(ex);
}
因此,如果您扩展 QuartzJobBean
类并实现 executeInternal
方法,此代码将在您的代码之前运行。如果您实现 Job
类和 execute
方法,则不会。就作业运行时实际发生的情况而言,这是两种方法之间的唯一区别。
所以要回答你的问题,问问自己“我想利用上面的代码吗?”。如果答案是肯定的,则扩展 QuartzJobBean
以利用该功能。如果您不需要这个附加功能,不想要它,和/或不想被上述代码隐含的依赖关系锁定,那么您应该实现 Job
以避免此代码及其依赖关系。我个人的方法是实现 Job
,除非我有理由扩展 QuartzJobBean
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。