gpt4 book ai didi

spring-boot-starter-quartz 实现作业与扩展 QuartzJobBean

转载 作者:行者123 更新时间:2023-12-05 01:31:37 24 4
gpt4 key购买 nike

我在我的一个项目中使用 Quartz Scheduler。创建 Quartz 作业主要有两种方式:

  1. 实现org.quartz.Job
  2. 扩展 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 调用希望您将其传递给它,那么这就是您的答案。

否则,答案取决于您是否想使用(并绑定(bind)到)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

关于spring-boot-starter-quartz 实现作业与扩展 QuartzJobBean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66066744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com