您的位置:首页 > 编程语言 > Java开发

Spring Boot 整合定时调度任务Quartz

2018-03-20 17:04 627 查看
第一:引入maven坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>spring-boot-demo</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--<exclusions>
<exclusion>
<groupId>org.springframework.quartz</groupId>
<artifactId>spring-quartz-starter-logging</artifactId>
</exclusion>
</exclusions>-->
</dependency>

<!-- log4j -->
<!--<dependency>
<groupId>org.springframework.quartz</groupId>
<artifactId>spring-quartz-starter-log4j2</artifactId>
</dependency>-->

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>

<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>

<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<!--true 不然不会生效-->
<scope>true</scope>
</dependency>

<!-- Quartz 定时调度任务必要jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>quartz-all</artifactId>
<version>1.6.3</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 没有该配置,devtools 不生效 -->
<fork>true</fork>
</configuration>
<dependencies>
<!-- spring热部署-->
<!-- https://mvnrepository.com/artifact/org.springframework/springloaded -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>


第二部:搭建好自己的Spring Boot项目
1.MyJobFactory
package com.example.boot.quartz;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;

/**
* @ClassName MyJobFactory
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 16:46
* @Version v.1.0.0
*/
@Component
public class MyJobFactory extends AdaptableJobFactory {

@Autowired
private AutowireCapableBeanFactory capableBeanFactory;

@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
2.MySchedulerpackage com.example.boot.quartz;

import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
* @ClassName MyScheduler
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 16:58
* @Version v.1.0.0
*/
@Component
public class MyScheduler {

public void schedulerJob() throws SchedulerException {
ApplicationContext annotationContext = SpringUtil.getApplicationContext();
Scheduler myScheduler = (StdScheduler) annotationContext.getBean("mySchedulerFactoryBean");
startScheduler1(myScheduler);
startScheduler2(myScheduler);
myScheduler.start();
}

private void startScheduler1(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MySchedulerJob.class).withIdentity("job1", "jobGroup1").build();
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5 * * * * ?");
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
}

private void startScheduler2(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MySchedulerJob2.class).withIdentity("job2", "jobGroup2").build();
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5 * * * * ?");
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "triggerGroup2")
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);

}
}
3.MySchedulerJobpackage com.example.boot.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
* @ClassName MySchedulerJob
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 16:54
* @Version v.1.0.0
*/
public class MySchedulerJob implements Job {

private SimpleDateFormat dateFormat() {
return new SimpleDateFormat("HH:mm:ss");
}

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("AAAA: The time is now " + dateFormat().format(new Date()));
}
}
4.MySchedulerJob2package com.example.boot.quartz;

import com.example.boot.domain.IInventory;
import com.example.boot.service.InventoryService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* @ClassName MySchedulerJob2
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 16:55
* @Version v.1.0.0
*/

@Component
public class MySchedulerJob2 implements Job {

@Autowired
InventoryService InventoryService;//这个service为spring管理的对象,service可自由编写

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
IInventory iInventory = InventoryService.selectPrimaryKey("2E5CB85354344F6B9B8BCAA3DF3818C8");
System.out.println("SchedulerJob2 event number: " + iInventory);
}
}5.MySchedulerListenerpackage com.example.boot.quartz;

import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

/**
* @ClassName MySchedulerListener
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 16:44
* @Version v.1.0.0
*/
@Component
public class MySchedulerListener implements ApplicationListener<ContextRefreshedEvent> {

@Autowired
MyScheduler myScheduler;

@Autowired
MyJobFactory myJobFactory;

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
myScheduler.schedulerJob();
System.out.println("SynchronizedData job start...");
} catch (SchedulerException e) {
e.printStackTrace();
}
}

@Bean(name ="mySchedulerFactoryBean")
public SchedulerFactoryBean mySchedulerFactory() {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setOverwriteExistingJobs(true);
bean.setStartupDelay(1);
bean.setJobFactory(myJobFactory);
return bean;
}
}
6.SpringUtilpackage com.example.boot.quartz;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* @ClassName SpringUtil
* @Description That's the purpose of the class
* @Author yin.zhh
* @Date 2018-03-19 17:00
* @Version v.1.0.0
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static final Logger logger = LoggerFactory.getLogger(SpringUtil.class);

private static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
logger.info("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getApplicationContext()获取applicationContext对象,applicationContext="
+ SpringUtil.applicationContext + "========");
}

public static ApplicationContext getApplicationContext() {
return applicationContext;
}

// 通过name获取 Bean.
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
return (T) getApplicationContext().getBean(name);
}

// 通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}

// 通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}工程结构:



启动即可============>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: