Quartz 是一個很強大的任務調度框架在SpringBoot中也很容易集成java
添加依賴:mysql
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!--Quartz--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
數據源:咱們須要實現一個接口 org.quartz.utils.ConnectionProvider 裏面的方法跟 數據庫鏈接池的方法比較類似,Quartz會幫助咱們注入各類屬性spring
通常狀況下來講可使用Druid或者C3p0數據源,不過咱們項目中以前已經集成過C3p0就沒必要再建立鏈接池直接經過反射獲取鏈接池實例便可,如圖:connnectionProvider就是咱們須要的sql
貼出主要代碼:數據庫
package cc.stdpain.xxx.component; import lombok.Data; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.c3p0.internal.C3P0ConnectionProvider; import org.hibernate.internal.NonContextualJdbcConnectionAccess; import org.hibernate.internal.SessionImpl; import org.quartz.utils.ConnectionProvider; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.SQLException; @Data public class QuartzC3p0ConnectionProvider implements ConnectionProvider { //這些屬性都會被注入,不過咱們項目中已經有現成的鏈接池 //JDBC驅動 public String driver; //JDBC鏈接串 public String URL; //數據庫用戶名 public String user; //數據庫用戶密碼 public String password; //數據庫最大鏈接數 public int maxConnections; //數據庫SQL查詢每次鏈接返回執行到鏈接池,以確保它仍然是有效的。 public String validationQuery; private C3P0ConnectionProvider c3P0ConnectionProvider; public QuartzC3p0ConnectionProvider() { try { Field sessionFactorField = MySqlClient.class.getDeclaredField("sessionFactory"); sessionFactorField.setAccessible(true); SessionFactory sessionFactory = (SessionFactory) sessionFactorField.get(MySqlClient.class); Session session = sessionFactory.openSession(); SessionImpl session1 = (SessionImpl) session; NonContextualJdbcConnectionAccess connectionAccess = (NonContextualJdbcConnectionAccess) session1.getJdbcConnectionAccess(); Field providerField = connectionAccess.getClass().getDeclaredField("connectionProvider"); providerField.setAccessible(true); c3P0ConnectionProvider = (C3P0ConnectionProvider) providerField.get(connectionAccess); } catch (NoSuchFieldException e) { e.printStackTrace(); System.exit(-1); } catch (IllegalAccessException e) { e.printStackTrace(); System.exit(-1); } } @Override public Connection getConnection() throws SQLException { return c3P0ConnectionProvider.getConnection(); } @Override public void shutdown() throws SQLException { c3P0ConnectionProvider.stop(); } @Override public void initialize() throws SQLException { //由於咱們的鏈接池已經初始化過了就不用在初始化了 } }
application.properties 文件配置session
#Quartz org.quartz.scheduler.instanceName=MyScheduler org.quartz.scheduler.instanceId=NON_CLUSTERED org.quartz.scheduler.skip-update-check=false org.quartz.scheduler.job-factory.class=org.quartz.simpl.SimpleJobFactory ## Quartz 線程池配置 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=1 #持久化配置 org.quartz.jobStore.misfireThreshold=50000 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.datasource=quartzDataSource org.quartz.jobStore.is-clustered=true org.quartz.jobStore.tablePrefix=QRTZ_ #數據源 #這個Provider就是本身實現的那個類 org.quartz.dataSource.quartzDataSource.connection-provider=cc.stdpain.xxx.component.QuartzC3p0ConnectionProvider #由於咱們用的是現成的數據源,這些屬性不要也罷不過爲了之後方便配置,仍是寫上比較好 org.quartz.dataSource.quartzDataSource.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.quartzDataSource.URL=jdbc:mysql://{ip}:45150/{database}?useSSL=false org.quartz.dataSource.quartzDataSource.user=test_user org.quartz.dataSource.quartzDataSource.password=test_passwd org.quartz.dataSource.quartzDataSource.maxConnections=5 org.quartz.dataSource.quartzDataSource.validationQuery=select 0
Bean配置app
@Configuration public class QuartzConfig { @Autowired AppConfig appConfig; //由於數據源依賴MysqlClient中的SessionFactory @DependsOn("mysqlClient") @Bean public Scheduler scheduler() throws IOException, SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzProperties()); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); return scheduler; } @Bean public Properties quartzProperties() throws IOException { Properties prop = new Properties(); prop.put("quartz.scheduler.instanceName", appConfig.getQuartzSchedulerInstanceName()); prop.put("org.quartz.scheduler.instanceId", appConfig.getQuartzSchedulerInstanceId()); prop.put("org.quartz.scheduler.skipUpdateCheck", appConfig.getQuartzSchedulerSkipUpdateCheck()); prop.put("org.quartz.scheduler.jobFactory.class", appConfig.getQuartzSchedulerJobFactoryClass()); prop.put("org.quartz.jobStore.class", appConfig.getQuartzJobStoreClass()); prop.put("org.quartz.jobStore.driverDelegateClass", appConfig.getQuartzJobStoreDriverDelegateClass()); prop.put("org.quartz.jobStore.dataSource", appConfig.getQuartzJobStoreDatasource()); prop.put("org.quartz.jobStore.tablePrefix", appConfig.getQuartzJobStoreTablePrefix()); prop.put("org.quartz.jobStore.isClustered", appConfig.getQuartzJobStoreIsClustered()); prop.put("org.quartz.threadPool.class", appConfig.getQuartzThreadPoolClass()); prop.put("org.quartz.threadPool.threadCount", appConfig.getQuartzThreadPoolThreadCount()); prop.put("org.quartz.dataSource.quartzDataSource.connectionProvider.class", appConfig.getQuartzDataSourceQuartzDataSourceConnectionProvider()); prop.put("org.quartz.dataSource.quartzDataSource.driver", appConfig.getQuartzDatasourceQuartzDataSourceDriver()); prop.put("org.quartz.dataSource.quartzDataSource.URL", appConfig.getQuartzDatasourceQuartzDataSourceUrl()); prop.put("org.quartz.dataSource.quartzDataSource.user", appConfig.getQuartzDatasourceQuartzDataSourceUser()); prop.put("org.quartz.dataSource.quartzDataSource.password", appConfig.getQuartzDatasourceQuartzDataSourcePassword()); prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", appConfig.getQuartzDatasourceQuartzDataSourceMaxConnections()); return prop; } }
數據庫表結構框架
-- 若是不支持外鍵 使用 init2.sql DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; DROP TABLE IF EXISTS QRTZ_LOCKS; DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; DROP TABLE IF EXISTS QRTZ_TRIGGERS; DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; DROP TABLE IF EXISTS QRTZ_CALENDARS; CREATE TABLE QRTZ_JOB_DETAILS( SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_NONCONCURRENT VARCHAR(1) NOT NULL, IS_UPDATE_DATA VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, NEXT_FIRE_TIME BIGINT(13) NULL, PREV_FIRE_TIME BIGINT(13) NULL, PRIORITY INTEGER NULL, TRIGGER_STATE VARCHAR(16) NOT NULL, TRIGGER_TYPE VARCHAR(8) NOT NULL, START_TIME BIGINT(13) NOT NULL, END_TIME BIGINT(13) NULL, CALENDAR_NAME VARCHAR(200) NULL, MISFIRE_INSTR SMALLINT(2) NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, REPEAT_COUNT BIGINT(7) NOT NULL, REPEAT_INTERVAL BIGINT(12) NOT NULL, TIMES_TRIGGERED BIGINT(10) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_CRON_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, CRON_EXPRESSION VARCHAR(120) NOT NULL, TIME_ZONE_ID VARCHAR(80), PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_SIMPROP_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, STR_PROP_1 VARCHAR(512) NULL, STR_PROP_2 VARCHAR(512) NULL, STR_PROP_3 VARCHAR(512) NULL, INT_PROP_1 INT NULL, INT_PROP_2 INT NULL, LONG_PROP_1 BIGINT NULL, LONG_PROP_2 BIGINT NULL, DEC_PROP_1 NUMERIC(13,4) NULL, DEC_PROP_2 NUMERIC(13,4) NULL, BOOL_PROP_1 VARCHAR(1) NULL, BOOL_PROP_2 VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_BLOB_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, BLOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_CALENDARS ( SCHED_NAME VARCHAR(120) NOT NULL, CALENDAR_NAME VARCHAR(200) NOT NULL, CALENDAR BLOB NOT NULL, PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) ENGINE=InnoDB; CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) ENGINE=InnoDB; CREATE TABLE QRTZ_FIRED_TRIGGERS ( SCHED_NAME VARCHAR(120) NOT NULL, ENTRY_ID VARCHAR(95) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, FIRED_TIME BIGINT(13) NOT NULL, SCHED_TIME BIGINT(13) NOT NULL, PRIORITY INTEGER NOT NULL, STATE VARCHAR(16) NOT NULL, JOB_NAME VARCHAR(200) NULL, JOB_GROUP VARCHAR(200) NULL, IS_NONCONCURRENT VARCHAR(1) NULL, REQUESTS_RECOVERY VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,ENTRY_ID)) ENGINE=InnoDB; CREATE TABLE QRTZ_SCHEDULER_STATE ( SCHED_NAME VARCHAR(120) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, LAST_CHECKIN_TIME BIGINT(13) NOT NULL, CHECKIN_INTERVAL BIGINT(13) NOT NULL, PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) ENGINE=InnoDB; CREATE TABLE QRTZ_LOCKS ( SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME)) ENGINE=InnoDB; CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY); CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME); CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME); CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); commit;
咱們任務的實體類ide
@Data public class TaskEntity implements Serializable { private final Long serialVersion = -12654128415L; private Long id; //ID private String jobName; //任務名稱 private String jobGroup; //任務分組 private String jobStatus; //任務狀態 private String jobClass;//任務執行方法 private String cronExpression; // cron 表達式 private String jobDescription; //任務描述 private String timeZoneId; // 時區 private Long startTime; private Long endTime; private String state; //狀態 private String invokeParam;//調用參數 }
添加任務的話 只須要指定 jobName jobGroup jobClass cronExpression jobDescription invokeParamspring-boot
@Slf4j @Service public class TaskService implements ITaskService { @Autowired private Scheduler scheduler; @Override public void addTask(TaskEntity taskEntity) { String jobName = taskEntity.getJobName(), jobGroup = taskEntity.getJobGroup(), cronExpression = taskEntity.getCronExpression(), jobDescription = taskEntity.getJobDescription(); String invokeParams = taskEntity.getInvokeParam(); try { if (checkExists(jobName, jobGroup)) { //error } TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey). withDescription(jobDescription).withSchedule(scheduleBuilder).build(); trigger.getJobDataMap().put("invokeParam", invokeParams); Class<? extends Job> clazz = (Class<? extends Job>) Class.forName(taskEntity.getJobClass()); JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey).withDescription(jobDescription).build(); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException | ClassNotFoundException e) { log.error("", e); } } @Override public void resumeTask(TaskEntity taskEntity) { try { scheduler.resumeJob(JobKey.jobKey(taskEntity.getJobName(), taskEntity.getJobGroup())); } catch (Exception e) { log.error("", e); } } @Override public void updateTask(TaskEntity info) { String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info.getCronExpression(), jobDescription = info.getJobDescription(), createTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); try { if (!checkExists(jobName, jobGroup)) { //Error } TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); JobKey jobKey = new JobKey(jobName, jobGroup); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(createTime).withSchedule(cronScheduleBuilder).build(); JobDetail jobDetail = scheduler.getJobDetail(jobKey); jobDetail.getJobBuilder().withDescription(jobDescription); Set<Trigger> triggerSet = new HashSet<>(); triggerSet.add(cronTrigger); scheduler.scheduleJob(jobDetail, triggerSet, true); } catch (SchedulerException e) { log.error("", e); } } @Override public void pauseTask(TaskEntity taskEntity) { TriggerKey triggerKey = TriggerKey.triggerKey(taskEntity.getJobName(), taskEntity.getJobGroup()); try { if (checkExists(taskEntity.getJobName(), taskEntity.getJobGroup())) { scheduler.pauseTrigger(triggerKey); //中止觸發器 } } catch (Exception e) { log.error("", e); } } @Override public void deleteTask(TaskEntity taskEntity) { TriggerKey triggerKey = TriggerKey.triggerKey(taskEntity.getJobName(), taskEntity.getJobGroup()); try { if (checkExists(taskEntity.getJobName(), taskEntity.getJobGroup())) { scheduler.pauseTrigger(triggerKey); //中止觸發器 scheduler.unscheduleJob(triggerKey); //移除觸發器 } } catch (SchedulerException e) { log.error("", e); } } private boolean checkExists(String jobName, String jobGroup) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); return scheduler.checkExists(triggerKey); } }
任務狀態查詢
SELECT QRTZ_JOB_DETAILS.JOB_NAME AS jobName, QRTZ_JOB_DETAILS.JOB_GROUP AS jobGroup, QRTZ_JOB_DETAILS.JOB_CLASS_NAME AS jobClass, QRTZ_TRIGGERS.DESCRIPTION AS jobDescription, QRTZ_TRIGGERS.TRIGGER_NAME AS triggerName, QRTZ_TRIGGERS.TRIGGER_GROUP AS triggerGroup, QRTZ_CRON_TRIGGERS.CRON_EXPRESSION AS cronExpression, QRTZ_TRIGGERS.START_TIME AS startTime, QRTZ_TRIGGERS.END_TIME AS endTime, QRTZ_TRIGGERS.TRIGGER_STATE AS state, QRTZ_CRON_TRIGGERS.TIME_ZONE_ID AS timeZoneId FROM QRTZ_JOB_DETAILS JOIN QRTZ_TRIGGERS JOIN QRTZ_CRON_TRIGGERS ON QRTZ_JOB_DETAILS.JOB_NAME = QRTZ_TRIGGERS.JOB_NAME AND QRTZ_TRIGGERS.TRIGGER_NAME = QRTZ_CRON_TRIGGERS.TRIGGER_NAME AND QRTZ_TRIGGERS.TRIGGER_GROUP = QRTZ_CRON_TRIGGERS.TRIGGER_GROUP
不過這樣建立出來的 Job 聲明週期不被Spring管理,所以沒法使用依賴注入等,若是須要依賴注入支持還須要一些其餘操做
對Jobs實現依賴注入
首先咱們須要一個Job的工廠
@Component @Slf4j public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { //調用父類的方法 Object jobInstance = super.createJobInstance(bundle); //進行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
對Scheduler設置bean中的工廠
scheduler.setJobFactory(jobFactory);
而後建立Job的時候就能夠依賴注入了
參考:https://yq.aliyun.com/articles/626199