Quartz 定時任務整合SpringBootDome
Quartz 定時任務整合SpringBootDome
Quartz 的四核心對象
-
Job
Job 漢語工作的意思,也不難看出這是一個放具體要執行的業務代碼;
-
JobDetail
JobDetail 這個是任務詳情,把那個具體的任務關聯起來(關聯具體的Job)
-
Trigger
Trigger 這個是觸發器,是要觸發要執行的任務
-
Scheduler
Scheduler 調度器 是要把所有的任務詳情和觸發器都注冊盡量,進行管理,(Scheduler 是單例模式)
進入maven 坐標
quartz需要spring-context的支持,所以引入 spring-context-support
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.9</version>
</dependency>
代碼實現
- 配置調度器 Schedule(此處借鑒renren-fast 的定時任務配置)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;
/**
* @Description Description
* @Author 張凱強
* @Date Created in 2021/8/25
* @E-mail 248048521@qq.com
*/
@Configuration
public class ScheduleConfig {
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
//quartz參數
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "RenrenScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
//線程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
//JobStore配置
prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
//集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
//PostgreSQL數據庫,需要打開此注釋
//prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
factory.setQuartzProperties(prop);
factory.setSchedulerName("RenrenScheduler");
//延時啟動
factory.setStartupDelay(30);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//可選,QuartzScheduler 啟動時更新己存在的Job,這樣就不用每次修改targetObject后刪除qrtz_job_details表對應記錄了
factory.setOverwriteExistingJobs(true);
//設置自動啟動,默認為true
factory.setAutoStartup(true);
// factory.setTaskExecutor();
return factory;
}
}
- 創建一個任務
import lombok.SneakyThrows;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @Description 創建一個任務
* @Author 張凱強
* @Date Created in 2021/8/25
* @E-mail 248048521@qq.com
*/
//@PersistJobDataAfterExecution // 單例實例化
//@DisallowConcurrentExecution // 禁止并發執行
public class QuartzJob extends QuartzJobBean {
@SneakyThrows
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// context.getScheduler() 調度器
Scheduler scheduler = context.getScheduler();
// context.getTrigger() 觸發器
Trigger trigger = context.getTrigger();
System.out.println(new Date());
// 可以在創建任務詳情時傳值進來,這里可以獲取
System.out.println(trigger.getJobDataMap().get("zkq"));
// context.getJobDetail() 任務
JobDetail jobDetail = context.getJobDetail();
System.out.println(jobDetail.getJobDataMap().get("zkq"));
}
- 服務層和服務實現層
/**
* @Description Description
* @Author 張凱強
* @Date Created in 2021/8/25
* @E-mail 248048521@qq.com
*/
public interface ScheduleJobService {
}
/**
* @Description Description
* @Author 張凱強
* @Date Created in 2021/8/25
* @E-mail 248048521@qq.com
*/
@Service
public class ScheduleJobServiceImpl implements ScheduleJobService {
//注入調度器
@Autowired
Scheduler scheduler;
/**
* 項目啟動時,初始化定時器
*/
@PostConstruct // 在對象初始化時執行
public void init(){
System.out.println("開始...");
// 創建一個 觸發器key
TriggerKey triggerKey = new TriggerKey("trigger", "group");
try {
// 獲取這個觸發器
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger == null){
// 觸發器為空時構建一個觸發器 0/10 * * * * ? 每10秒觸發一次 規則請自行百度cron表達式
trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?").withMisfireHandlingInstructionDoNothing()).build();
rigger.getJobDataMap().put("zkq","aaa");
// 構建一個任務詳情, 把任務放進來,這個對象類型為class,這里是 QuartzJob.class
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity("job", "group").build();
// 把之任務和觸發器注冊進調度器中
jobDetail.getJobDataMap().put("zkq","每天努力一點點!");
scheduler.scheduleJob(jobDetail, trigger);
// scheduler.triggerJob();
// 運行這個調度器
// scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
成功結果

到此結束!有錯誤歡迎提出,大神勿噴!
浙公網安備 33010602011771號