SpringBoot整合Quartz實現定時任務(單任務、多任務)

前言:爲了實現如:定時發送郵件,訂單超時等操作需要使用到任務調度,爲了節約自己封裝的時間所以使用Quatrz開源項目來幫助我們實現這些繁雜的操作,Quatrz內部有自己的線程池,不需要我們去手動維護線程,而且支持cron表達式等,下面我們講解一下使用Springboot2.x來整合Quatrz

1,先是導入依賴,少了依賴可不行

<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.itpengwei.diao</groupId>
	<artifactId>boot-quartz</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.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-web</artifactId>
		</dependency>
		<!--必須添加,要不然會出錯,項目無法啓動 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
		</dependency>
		<!--必須添加,要不然會出錯,項目無法啓動 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
		</dependency>

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

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

第二步:創建任務類,這裏我就創建兩個來實現多任務,單任務也是同理

package com.itpengwei.config;

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

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class FirstJob {

	public void task() {
		System.out.println("任務1執行....當前時間爲" + dateFormat().format(new Date()));
	}

	private SimpleDateFormat dateFormat() {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
		return simpleDateFormat;
	}
}
package com.itpengwei.config;

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

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class SecondJob {

	public void task() {
		System.out.println("任務2執行....當前時間爲" + dateFormat().format(new Date()));
	}

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

第三步:將任務進行配置,項目啓動就會開始執行了

package com.itpengwei.config;

import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;

@Configuration
public class QuartzConfiguration {

	// 配置定時任務1
	@Bean(name = "firstJobDetail")
	public MethodInvokingJobDetailFactoryBean firstJobDetail(FirstJob firstJob) {
		MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
		// 是否併發執行
		jobDetail.setConcurrent(true);
		// 爲需要執行的實體類對應的對象
		jobDetail.setTargetObject(firstJob);
		// 需要執行的方法
		jobDetail.setTargetMethod("task");
		return jobDetail;
	}

	// 配置觸發器1
	@Bean(name = "firstTrigger")
	public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
		SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
		trigger.setJobDetail(firstJobDetail);
		// 設置任務啓動延遲
		trigger.setStartDelay(0);
		// 每10秒執行一次
		trigger.setRepeatInterval(10000);
		return trigger;
	}

	// 配置定時任務2
	@Bean(name = "secondJobDetail")
	public MethodInvokingJobDetailFactoryBean secondJobDetail(SecondJob secondJob) {
		MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
		// 是否併發執行,假如設置爲10秒一次,如果上一次因爲到了時間沒有執行那麼當前這個任務會併發執行,
		// 如果爲false的話就會等上一次執行完才執行
		jobDetail.setConcurrent(true);
		// 爲需要執行的實體類對應的對象
		jobDetail.setTargetObject(secondJob);
		// 需要執行的方法
		jobDetail.setTargetMethod("task");
		return jobDetail;
	}

	// 配置觸發器2
	@Bean(name = "secondTrigger")
	public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
		CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
		trigger.setJobDetail(secondJobDetail);
		// cron表達式,每過10秒執行一次
		trigger.setCronExpression("0/10 * * * * ?");
		return trigger;
	}

	// 配置Scheduler
	@Bean(name = "scheduler")
	public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
		SchedulerFactoryBean bean = new SchedulerFactoryBean();
		// 延時啓動,應用啓動5秒後
		bean.setStartupDelay(5);
		// 註冊觸發器
		bean.setTriggers(firstTrigger, secondTrigger);
		return bean;
	}
}

測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章