1. 程式人生 > >springboot 自定義配置Quartz動態定時器

springboot 自定義配置Quartz動態定時器

在整個專案規劃中,有的時候需要定時的去執行某一段程式碼,觸發時間能隨時修改,並且不影響專案的整體執行。所以,定時器的設計就必須要靈活,能隨時的增,刪,改定時任務。

1. 資料庫設計

CREATE TABLE `sys_task` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL COMMENT '建立時間',
  `updated_at` datetime NOT NULL COMMENT '修改時間',
  `task_name` varchar(255) DEFAULT NULL COMMENT '任務名稱',
  `task_remark` varchar(255) DEFAULT NULL COMMENT '說明',
  `job_class` varchar(255) NOT NULL COMMENT '任務類',
  `cron_expression` varchar(255) NOT NULL COMMENT '規則表示式',
  `is_enable` smallint(1) NOT NULL COMMENT '是否啟用',
  `status` varchar(25) DEFAULT NULL COMMENT '狀態',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COMMENT='系統任務排程';

2.maven 依賴

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.7.RELEASE</version>
</dependency>

3. 排程器類

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

/**
 * 任務排程
 *
 */
@Configuration
public class QuartzScheduler {

	@Autowired
	private Scheduler scheduler;
	
	
	/**
     * 獲取Job資訊
     * 
     * @param name 類名
     * @return
     * @throws SchedulerException
     */
    public String getJobInfo(String name) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(name, scheduler.DEFAULT_GROUP);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),
                scheduler.getTriggerState(triggerKey).name());
    }
	
    /**
     * 修改某個任務的執行時間
     * 
     * @param name 類名
     * @param time 任務觸發時間
     * @return
     * @throws SchedulerException
     */
    public boolean modifyJob(String name, String time) throws SchedulerException {
        Date date = null;
        TriggerKey triggerKey = new TriggerKey(name, scheduler.DEFAULT_GROUP);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(time)) {
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, scheduler.DEFAULT_GROUP)
                    .withSchedule(cronScheduleBuilder).build();
            date = scheduler.rescheduleJob(triggerKey, trigger);
        }
        return date != null;
    }

    /**
     * 暫停所有任務
     * 
     * @throws SchedulerException
     */
    public void pauseAllJob() throws SchedulerException {
        scheduler.pauseAll();
    }

    /**
     * 暫停某個任務
     * 
     * @param name 類名
     */
    public void pauseJob(String name) throws SchedulerException {
        JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢復所有任務
     * 
     * @throws SchedulerException
     */
    public void resumeAllJob() throws SchedulerException {
        scheduler.resumeAll();
    }

    /**
     * 恢復某個任務
     * 
     * @param name  類名
     */
    public void resumeJob(String name) throws SchedulerException {
        JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.resumeJob(jobKey);
    }

    /**
     * 刪除某個任務
     * 
     * @param name 類名
     */
    public void deleteJob(String name) throws SchedulerException {
        JobKey jobKey = new JobKey(name, scheduler.DEFAULT_GROUP);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.deleteJob(jobKey);
    }
    
    /**
     * 新增定時器
     * 
     * @param name 類名
     * @param time 任務觸發時間
     * @throws SchedulerException
     */
    public void addJob(String name,String time) throws SchedulerException {
    	Class classs = null;
		try {
			classs = Class.forName(name);
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
    	JobDetail jobDetail = JobBuilder.newJob(classs).withIdentity(name, scheduler.DEFAULT_GROUP).build();
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, scheduler.DEFAULT_GROUP)
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }
}

4.初始化任務

import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;



import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;

/**
 * 任務初始化排程

 *
 */
@Configuration
public class ApplicationStartQuartzJob implements ApplicationListener<ContextRefreshedEvent> {
	@Autowired
	private SysTaskService sysTaskService;
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		Example example=new Example(SysTask.class);
		Criteria createCriteria = example.createCriteria();
		createCriteria.andEqualTo("isEnable", 1);
		List<SysTask> sysTaskList = sysTaskService.selectByExample(example);
		Scheduler scheduler=null;
		try {
			scheduler = scheduler();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		if(!sysTaskList.isEmpty()){
			for (SysTask sysTask : sysTaskList) {
				Class classs=null;
				try {
					classs = Class.forName(sysTask.getJobClass());
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			JobDetail jobDetail = JobBuilder.newJob(classs).withIdentity(sysTask.getJobClass(), scheduler.DEFAULT_GROUP).build();
		    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysTask.getCronExpression());
		    CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(sysTask.getJobClass(), scheduler.DEFAULT_GROUP)
		                .withSchedule(cronScheduleBuilder).build();
		        try {
					scheduler.scheduleJob(jobDetail, cronTrigger);
				} catch (SchedulerException e) {
					e.printStackTrace();
				}
		 }
	  }
		try {
			scheduler.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	 /**
     * 初始注入scheduler
     * @return
     * @throws SchedulerException
     */
    @Bean
    public Scheduler scheduler() throws SchedulerException{
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        return schedulerFactoryBean.getScheduler(); 
    }

}

5.編寫測試類

public class Test1 implements Job {

   @Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
        //任務執行邏輯程式碼片段
   }

}

Spring Boot與quartz的整合已經完成了,可以通過配置表sys_task表中的資料數來靈活的配置定時任務了。

相關推薦

springboot 定義配置Quartz動態定時

在整個專案規劃中,有的時候需要定時的去執行某一段程式碼,觸發時間能隨時修改,並且不影響專案的整體執行。所以,定時器的設計就必須要靈活,能隨時的增,刪,改定時任務。 1. 資料庫設計 CREATE TABLE `sys_task` ( `id` int(11) NOT

我的springboot之路(2)----springboot定義配置詳解

一、前言 我的springboot之路(1)介紹了springboot的誕生背景以及優點等,我們知道springboot簡化了程式設計配置,它體現出了一種 約定優於配置,也稱作按約定程式設計,是一種軟體設計正規化,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。 一般

SpringBoot定義配置檔案(xxx.properties)

轉載 :https://www.cnblogs.com/V1haoge/p/7183408.htmlSpringBoot中免除了大部分手動配置,但是對於一些特定的情況,還是需要我們進行手動配置的,SpringBoot為我們提供了application.properties配置檔案,讓我們可以進行自定義配置,來

SpringBoot定義配置檔案讀取

SpringBoot自定義配置檔案有兩種讀取方式 如在配置檔案中自定義如下配置 @Value註解讀取自定義配置檔案——用於逐個讀取自定義的配置 新建一個controller類如下: @Controller public class ConfigInfoControll

springboot定義配置選項檢視技巧

在使用springboot的時候,由於它的自動配置的存在,一開始很容易上手進行應用開發,但是等需要進行深度自定義配置的時候,很多人蒙圈,哪些內容可以自定義配置,配置引數是什麼等等問題接踵而來,剛好我有

51微控制器定義多個軟體定時

/*---------------------------------------------------- 名稱:用定時器控制led亮滅 微控制器:stc12c2052 晶振:12M 說明:四個led,四種頻率亮。 ------------------------------------------

C#中定義高精度Timer定時的實例教程

edm 想要 精確 方式 mes 監視 工具 討論 etime Timer 用於以用戶定義的事件間隔觸發事件。Windows 計時器是為單線程環境設計的,其中,UI 線程用於執行處理。它要求用戶代碼有一個可用的 UI 消息泵,而且總是在同一個線程中操作,或者將調用封送到另一

(六)、SpringBoot 定義配置屬性,可以在application.properties中修改

可以前往第一篇部落格檢視目錄結構 --> 這裡一、自定義配置 (一些動態的資料:登入頁面地址 、接收資料格式等等)二、在core模組下建立properties目錄 : com.zeke.core.properties 。在properties目錄下建立SecurityP

SpringBoot定義配置檔案fatjar獲取不到解決辦法

SpringBoot中有一部分自定義的配置檔案在打成jar包後無法獲取 一部分自定義配置在jar包中無法獲取的問題,原來是根據classpath獲取,在jar包中無法獲取,在讀取的時候空指標異常 用spring的resouce獲取後就能正常讀到,介紹下spr

springboot 定義配置檔案

除了application.yml ,自定義另外的配置檔案,如何讀取。 bus.yml: email: [email protected] scheduleEnable: true

SpringBoot(二): SpringBoot屬性配置文件 SpringBoot多環境配置文件 SpringBoot定義配置文件

發的 strong 技術 npr cat 創建 錯誤 圖片 選擇 1.屬性配置文件 一共分為兩種,一種是鍵值對的properties屬性配置文件,一種是yaml格式的配置文件 properties配置: 2.多環境配置文件 當我們的項目中有多套配置文件 比如開發

SpringBoot 基礎系列】實現一個定義配置載入(應用篇)

![](https://spring.hhui.top/spring-blog/imgs/200507/logo.jpg) > [【SpringBoot 基礎系列】實現一個自定義配置載入器(應用篇)](https://mp.weixin.qq.com/s?__biz=MzU3MTAzNTMzMQ==&

Springboot-讀取核心配置文件及定義配置文件

定義 自定義配置文件 () 創建 ble get 兩個 ash dex 讀取核心配置文件 核心配置文件是指在resources根目錄下的application.properties或application.yml配置文件,讀取這兩個配置文件的方法有兩種,都比較簡單。 核

Springboot定義配置文件及讀取配置文件

ebo hello path host 目錄 tps pre 示例 control 本文章來自【知識林】 讀取核心配置文件 核心配置文件是指在resources根目錄下的application.properties或application.yml配置文件,讀取這兩個配置文件

Springboot讀取配置文件及定義配置文件

val request wire odin 自定義配置文件 方式 -s bin ssi 1.創建maven工程,在pom文件中添加依賴 1 <parent> 2 <groupId>org.springframework.boot

Springboot讀取配置檔案、pom檔案及定義配置檔案

前言 很多人都知道讀取配置檔案,這是初級做法,上升一點難度是使用java bean的方式讀取自定義配置檔案,但是大家很少有知道讀取pom檔案資訊,接下來我都會講到。 正文 筆者還是基於Spring Boot ::        (v1.5.8.RE

SpringBoot(11) SpringBoot定義攔截

自定義攔截器共兩步:第一:註冊。第二:定義攔截器。 一、註冊 @Configuration 繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本) 舊版本程式碼 1 @Configuration 2 public class CustomO

SpringBoot定義初始化Listener配置

SpringBoot自定義初始化Listener配置 0x01 摘要 在傳統的以Spring-Web程式中,我們會繼承ContextLoaderListener來實現一些早期執行的初始化程式碼。但是現在遷移到Spring-Boot後發現不能這麼做了。本文講講在SpringBoot

springboot自動切定義配置

<plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>co

springboot---讀取定義配置檔案

讀取自定義配置檔案 在有些時候,我們要配置一些資料,地址,路徑等操作,比如,上傳檔案的地址,新老路徑的定義,白名單介面等,這個時候需要在配置檔案裡面進行配置,而不是寫在程式碼裡面,在springboot裡面可以使用註解和實體兩種方式進行獲取到配置檔案裡面的配置資訊,我的做法是建立一個class,