Spring Boot集成Quartz注入Spring管理的类的方法

yizhihongxing

下面详细讲解如何使用Spring Boot集成Quartz并注入Spring管理的类。

准备工作

首先,我们需要引入相关依赖。在 pom.xml 中加入以下依赖:

<!-- Quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>
<!-- Quartz-Scheduler integration with Spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>

配置Quartz

在 Spring Boot 中,我们可以使用 @Configuration 注解来配置 Quartz,并使用 QuartzJobBean 接口实现我们的任务。

@Configuration
public class QuartzConfig {

    /**
     * 配置定时任务
     */
    @Bean
    public JobDetail sampleJobDetail() {
        return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")
                .usingJobData("name", "world").storeDurably().build();
    }

    /**
     * 配置触发器
     */
    @Bean
    public Trigger sampleJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10).repeatForever();

        return TriggerBuilder.newTrigger().forJob(sampleJobDetail())
                .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
    }

    /**
     * 配置定时任务管理器
     */
    @Bean
    public SchedulerFactoryBean schedulerFactory(ApplicationContext applicationContext,
                                                  JobFactory jobFactory) throws IOException {

        SchedulerFactoryBean factory = new SchedulerFactoryBean();

        // 全局 Job 监听器
        factory.setGlobalJobListeners(new SampleJobListener());

        // 全局 Trigger 监听器
        factory.setGlobalTriggerListeners(new SampleTriggerListener());

        factory.setJobFactory(jobFactory);

        // 配置 QuartzProperties
        factory.setQuartzProperties(quartzProperties());

        return factory;
    }

    /**
     * 配置 QuartzProperties
     * @throws IOException 
     */
    private Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    /**
     * 配置任务工厂
     */
    @Bean
    public JobFactory jobFactory(ApplicationContext applicationContext) {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

}

在上面的配置中,我们通过 JobDetail 定义了一个名为 sampleJob 的 Quartz 任务,并通过 name 声明了一个任务参数。接着,我们通过 Trigger 配置了任务触发器,每隔 10 秒钟触发一次。

最后,我们通过 SchedulerFactoryBean 配置了定时任务管理器,注入了一个自定义的 JobFactory,它用于将任务对象注入到 Spring 容器中,并配置了一个全局的 Job 监听器和 Trigger 监听器。

在上述配置中,我们引用了一个 AutowiringSpringBeanJobFactory 类,这是一个用于将 Quartz 中的 Job 类注入到 Spring 容器中的类。我们需要自己实现这个类:

public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
        ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

编写任务类

在我们的任务类中,我们首先需要实现 Quartz 中的 Job 接口,并注入我们的 Spring Bean,实现任务逻辑。

public class SampleJob implements Job {

    private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);

    @Autowired
    private SampleService sampleService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        logger.info("Running SampleJob...");
        logger.info("Hello " + context.getJobDetail().getJobDataMap().getString("name"));
        sampleService.run();
    }
}

在上面的任务类中,我们通过 @Autowired 注解将 SampleService 注入到了正在运行的任务中。

@Service
public class SampleService {

    private static final Logger logger = LoggerFactory.getLogger(SampleService.class);

    public void run() {
        logger.info("Running SampleService...");
    }

}

上面的代码演示了如何在 Quartz 任务中注入 Spring Bean,并通过 Spring 框架执行任务逻辑。

示例

接下来,我们演示如何使用上述配置和任务类,实现定时任务。

Servlet 容器部署

如果你是使用 Servlet 容器部署的 Spring Boot 应用,在 application.properties 中配置以下属性:

# 配置定时任务触发频率(此处配置的是 5 分钟触发一次)
spring.quartz.properties.org.quartz.jobStore.isClustered = false
spring.quartz.properties.org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
spring.quartz.properties.org.quartz.threadPool.threadCount=3
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=600000
spring.quartz.properties.org.quartz.jobStore.acquireTriggersWithinLock=true
spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.job-store-type=memory
spring.quartz.job-store-type='quartz'
spring.quartz.properties.org.quartz.scheduler.instanceName = MyScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO
spring.task.scheduling.pool.size=3

单独运行

如果你是使用单独运行的 Spring Boot 应用,程序启动后会执行定时任务,例如:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    CommandLineRunner demoRunner(SchedulerFactoryBean schedulerFactory) {
        return new CommandLineRunner() {
            @Override
            public void run(String... args) throws Exception {
                Scheduler scheduler = schedulerFactory.getScheduler();
                scheduler.scheduleJob(sampleJobDetail(), sampleJobTrigger());
                scheduler.start();
            }
        };
    }

}

在上面的代码中,我们通过 CommandLineRunner 将我们的任务注入到 Spring 容器中,并构建定时任务。

小结

通过本文,我们了解了如何使用 Spring Boot 集成 Quartz 并注入 Spring 管理的类,实现定时任务的自动配置。同时,我们也提供了在 Servlet 容器部署和单独运行中,如何使用该配置的两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot集成Quartz注入Spring管理的类的方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 在Windows10中安装TomCat的教程图解

    以下是“在Windows10中安装TomCat的教程图解”的完整攻略: 准备工作 在安装Tomcat之前,需要先确保以下几点: 确认Windows10已经安装了Java开发环境(JDK)。可以到Oracle官网下载JDK,也可以通过搜索引擎搜索其他可信的JDK下载地址。 下载Tomcat安装包。可以到Tomcat官网下载最新的Tomcat安装包,也可以通过搜…

    Java 2023年5月19日
    00
  • springboot中jsp配置tiles全过程

    下面是Spring Boot中配置JSP和Tiles的整个过程及两个示例展示。 1. 引入JSP和Tiles依赖 首先,在pom.xml中添加JSP和Tiles的依赖: <!–JSP依赖–> <dependency> <groupId>org.apache.tomcat.embed</groupId> &l…

    Java 2023年6月15日
    00
  • java实现图书管理系统

    Java实现图书管理系统示例 1. 开发环境准备 在开始开发之前,需要准备以下开发工具和环境: Java SE Development Kit(JDK)——Java开发工具包,用于编写和运行Java程序。 Eclipse IDE——一款Java开发集成工具,可以在其中编写Java代码。 MySQL数据库——用于存储图书和用户信息。 Navicat for M…

    Java 2023年5月18日
    00
  • Java时间轮算法的实现代码示例

    Java时间轮算法是一种实现定时任务调度的算法,它的实现原理是使用一个循环的时间轮来管理任务的执行时间。该算法的效率高、精度高、可靠性高,因此在实际项目中被广泛应用。以下是实现Java时间轮算法的攻略及代码示例。 实现步骤 Java时间轮算法的实现分为以下步骤: 定义时间轮:需要定义时间轮的大小(即时间间隔),以及每个槽(slot)上要执行的任务列表。 初始…

    Java 2023年5月18日
    00
  • 解决IDEA中Maven项目中JSTL标签无效问题

    针对“解决IDEA中Maven项目中JSTL标签无效问题”的完整攻略,以下是具体的步骤: 1. 项目添加JSTL依赖库 首先,在IDEA的Maven项目中需要添加JSTL依赖库,可以在pom.xml中添加以下代码: <dependency> <groupId>javax.servlet</groupId> <arti…

    Java 2023年5月19日
    00
  • Java实现用户管理系统

    Java实现用户管理系统攻略 系统设计 在实现用户管理系统之前,需要对系统进行设计。以下是设计具体步骤: 1. 需求分析 首先对用户管理系统的需求进行分析,了解该系统的基本功能和操作流程。 2. 数据库设计 根据需求分析,设计数据库表结构,存储用户信息等数据。 3. 系统架构设计 根据需求和数据库设计,设计系统架构,包括系统模块划分、模块间的交互等。 4. …

    Java 2023年5月18日
    00
  • Mac下安装配置Maven并在IDEA中配置的详细教程

    下面是Mac下安装配置Maven并在IDEA中配置的详细教程。 安装Maven 下载Maven 在Maven官网下载页面中,选择合适的Maven版本进行下载(https://maven.apache.org/download.cgi)。目前最新版本为3.8.3。 解压Maven安装包 解压下载下来的Maven安装包,将其中的文件解压到本地目录。可以在终端输入…

    Java 2023年5月20日
    00
  • Java语言的缺点是什么?

    Java作为一种非常流行的编程语言,它具有很多优点,但也有一些缺点。本文将详细讲解Java语言的缺点。 内存消耗较高 Java语言的内存消耗较高,这是由于Java程序在运行时需要将代码转换为字节码,然后再由JVM解释执行。这种过程需要占用大量的内存资源。另外,Java中的垃圾回收机制也会占用大量的内存。这些都会导致Java程序的内存占用较高,特别是在处理大量…

    Java 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部