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

标签 spring-boot jobs quartz

我在我的一个项目中使用 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/

相关文章:

java - Spring Boot启动时加载数据到Ehcache 3

laravel - 如何在 Laravel 8 中获取作业批处理列表

laravel - Laravel 中的 Job、Queue 和 Worker 有什么区别?

java - 使 Quartz 作业可进行单元测试

带有 Quartz 和 Tomcat 数据源的 SpringBoot : Driver's Blob representation is of an unsupported type: oracle. sql.BLOB

spring - 如何在 spring boot 中从同一个应用程序调用另一个 api

spring - 仅当设置了特定 Spring 配置文件时才运行集成测试

java - 如何在Spring中的@Bean方法中定义可选参数(依赖项)?

hadoop - 如何让Hadoop Pig Job更可靠?

swift - 如何使用 cocoa swift 显示 pdf(版本 3.1)