springBoot整合quartz叢集
- 1、匯入依賴:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
- 2、在專案中新增quartz.properties檔案(這樣就不會走它自帶的properties檔案)
#quartz叢集配置
# ===========================================================================
# Configure Main Scheduler Properties 排程器屬性
# ===========================================================================
#排程標識名 叢集中每一個例項都必須使用相同的名稱
org.quartz.scheduler.instanceName=DefaultQuartzScheduler
#ID設定為自動獲取 每一個必須不同
org.quartz.scheduler.instanceid=AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
#執行緒池的實現類(一般使用SimpleThreadPool即可滿足幾乎所有使用者的需求)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#指定執行緒數,至少為1(無預設值)(一般設定為1-100直接的整數合適)
org.quartz.threadPool.threadCount = 5
#設定執行緒的優先順序(最大為java.lang.Thread.MAX_PRIORITY 10,最小為Thread.MIN_PRIORITY 1,預設為5)
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
# 資訊儲存時間 預設值60秒
org.quartz.jobStore.misfireThreshold = 60000
#資料儲存方式為資料庫持久化
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#資料庫代理類,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以滿足大部分資料庫
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#使用自己的配置檔案
org.quartz.jobStore.useProperties = true
#資料庫別名 隨便取
org.quartz.jobStore.dataSource = myDS
#表的字首,預設QRTZ_
org.quartz.jobStore.tablePrefix = qrtz_
#是否加入叢集
org.quartz.jobStore.isClustered = false
#排程例項失效的檢查時間間隔
org.quartz.jobStore.clusterCheckinInterval = 20000
#============================================================================
# Configure Datasources
#============================================================================
#資料庫引擎
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#資料庫連線
org.quartz.dataSource.myDS.URL = jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
#資料庫使用者
org.quartz.dataSource.myDS.user = root
#資料庫密碼
org.quartz.dataSource.myDS.password = cym
#允許最大連線
org.quartz.dataSource.myDS.maxConnections = 50
#驗證查詢sql,可以不設定
#org.quartz.dataSource.myDS.validationQuery=select 0 from dual
3 、 在資料庫中建立quartz相關的表
進入quartz的官網http://www.quartz-scheduler.org/,點選Downloads,下載後在目錄\docs\dbTables下有常用資料庫建立quartz表的指令碼。
4 、註冊相關的bean
- 自定義AutowiringSpringBeanJobFactory,解決spring不能在quartz中注入bean的問題
package com.cci.eclickup.common.configuration.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
/**
* @Author: Kingcym
* @Description:
* @Date: 2017/12/14 0:31
*/
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
ApplicationContextAware {
private transient AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
註冊SchedulerFactoryBean的bean
package com.cci.eclickup.common.configuration.quartz;
import org.quartz.spi.JobFactory;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.util.Properties;
/**
* @Author: Kingcym
* @Description:
* @Date: 2017/12/13 23:45
*/
@Configuration
public class QuartzConfig {
public static final String QUARTZ_PROPERTIES_PATH = "/quartz.properties";
@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean( JobFactory jobFactory) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory);
schedulerFactoryBean.setStartupDelay(20);
//用於quartz叢集,載入quartz資料來源配置
schedulerFactoryBean.setQuartzProperties(quartzProperties());
return schedulerFactoryBean;
}
public Properties quartzProperties(){
PropertiesFactoryBean factoryBean = new PropertiesFactoryBean();
factoryBean.setLocation(new ClassPathResource(QUARTZ_PROPERTIES_PATH));
try {
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
定義JobDetail,Trigger
package com.cci.eclickup.common.configuration.quartz;
import com.cci.eclickup.cn.task.CheckStatusTask;
import com.cci.eclickup.cn.task.InsertEvaluateTask;
import org.apache.log4j.Logger;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import static org.quartz.CronScheduleBuilder.cronSchedule;
/**
* @Author: Kingcym
* @Description:
* @Date: 2017/12/14 0:14
*/
@Component
public class QuartzScheduler {
@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
private Logger logger = Logger.getLogger(QuartzScheduler.class);
@PostConstruct
public void init() throws SchedulerException {
scheduleJobs();
}
public void scheduleJobs() throws SchedulerException {
logger.info("=======任務初始化========");
Scheduler scheduler = schedulerFactoryBean.getScheduler();
//需要傳遞資料,就是使用JobDataMa
// JobDataMap jobDataMap = new JobDataMap();
// jobDataMap.put("jobArg", "world");
//CheckStatusTask.class 是需要執行定時任務的類名
JobDetail jobDetail = JobBuilder.newJob(CheckStatusTask.class)
// .setJobData(jobDataMap)
.withDescription("CheckStatusTask")
.withIdentity("job-CheckStatus", "demo-group")
.build();
//InsertEvaluateTask.class 是需要執行定時任務的類名
JobDetail jobDetail2 = JobBuilder.newJob(InsertEvaluateTask.class)
// .setJobData(jobDataMap)
.withDescription("InsertEvaluateTask")
.withIdentity("job-InsertEvaluate", "demo-group")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(cronSchedule("0 0/2 * * * ? "))
.build();
Trigger trigger2 = TriggerBuilder.newTrigger()
.forJob(jobDetail2)
.withSchedule(cronSchedule("0 0/1 * * * ? "))
.build();
try {
if(!scheduler.checkExists(JobKey.jobKey("job-CheckStatus","demo-group"))){
scheduler.scheduleJob(jobDetail,trigger);
}
if(!scheduler.checkExists(JobKey.jobKey("job-InsertEvaluate","demo-group"))){
scheduler.scheduleJob(jobDetail2,trigger2);
}
scheduler.start();
logger.info("=======任務初始化完成========");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
- 5 定義定時任務,只需繼承Job介面,實現execute方法
package com.cci.eclickup.cn.task;
import com.cci.eclickup.cn.service.EclickupService;
import org.apache.log4j.Logger;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Description: 定時重新整理z_check_evaluate裡的checkStatus
* @author cym
* @date 2017年12月14日 上午12:04:40
* @version V1.0
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class CheckStatusTask implements Job {
private Logger log = Logger.getLogger(CheckStatusTask.class);
@Autowired
private EclickupService eclickupService;
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info("===============定時重新整理z_check_evaluate裡的checkStatus 開始==============");
int result = eclickupService.editCheckStatus();
if (result > 0)
log.info("===============定時重新整理z_check_evaluate裡的checkStatus 成功==============個數:"+result);
}
}
相關推薦
springboot整合quartz(叢集環境)
使用quartz實現定時任務,若是部署多臺機器,那麼到了時間點,多臺伺服器便會同時均開始執行定時任務,這不符合我們的功能實現。 quartz叢集分為水平叢集和垂直叢集,水平叢集即將定時任務節點部署在不同的伺服器,其最大的問題就是時鐘同步問題,若時鐘不能同步,則會導致叢集中
springBoot整合quartz叢集
1、匯入依賴: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&
SpringBoot整合Quartz定時任務 的簡單實例 2
哪裏 整合 持久 是否 repeat package prop 創建方式 log (1)什麽是Quartz?(2)Quartz的特點;(3)Quartz專用詞匯說明;(4)Quartz任務調度基本實現原理; 接下來看下具體的內容: (1)什麽是Qua
springboot整合Quartz實現動態配置定時任務
打印 uil xtra serve mail evel .com 指定 obs 前言 在我們日常的開發中,很多時候,定時任務都不是寫死的,而是寫到數據庫中,從而實現定時任務的動態配置,下面就通過一個簡單的示例,來實現這個功能。 一、新建一個springboot工程,並添加依
springboot整合quartz定時器實現定時任務詳解
最近需要 做一個按照時間,定時初始化一些資訊的功能,研究了一下quartz,也簡單瞭解一下TimerTask,廢話不多說。 quartz和TimerTask的區別: timer是jdk自帶的(可想而知,肯定是不怎麼好用)。 Quartz可以通過cron表示式精確到特定時間執行,而T
springboot 整合quartz詳解
本文主要是針對springboot 整合quartz 來說明,作為一個小白我總喜歡上網查詢資料,然後希望找的東西能80%符合自己的需求,能直接拿來用的,但是很多時候網上的案例都是一個copy一個的,看的東西千篇一律,而且有些內容解釋的也是寥寥數語,所以有時候也需要自己寫點東西分享給大眾,今天也是自己
SpringBoot系列5-定時任務-springboot整合quartz實現動態定時任務
springboot有自帶的定時任務為什麼還要使用quartz 使用springboot自帶的定時任務可以很簡單很方便的完成一些簡單的定時任務,但是我們想動態的執行我們的定時任務就比較困難了。然而使用quartz卻可以很容易的管理我們的定時任務,很容易動態的操作定時任務。下面我們就講解下
springboot-整合quartz:做分散式定時任務
springboot-整合quartz:做分散式定時任務 文章目錄 springboot-整合quartz:做分散式定時任務 1.quartz應用場景 2配置 3.測試 完
springboot+quartz+sqlserver springboot整合quartz持久化到sqlserver資料庫
目錄 1、執行sqlserver資料庫指令碼 2、配置application-quartz.properties引數 3、配置類 4、排程類 5、觸發類 1、執行sqlserver資料庫指令碼 IF EXISTS (SELECT *
springboot整合 Quartz
為什麼使用 Quartz? Quartz 是一個任務排程框架。比如你遇到這樣的問題: 每天 02:00 傳送一份工作郵件給工作組成員並抄送給老闆(假裝自己很努力的工作到深夜) 每月 2 號提醒自己還信用卡或自動還款 什麼是 cron 表示式? cron 是 Lin
springboot整合redis叢集
1.新增redis啟動器 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte
SpringBoot整合quartz動態建立定時任務實現以及踩過的坑
需要了解一下quartz有Job,Scheduler,Trigger等概念,在此就不詳細說明 首先說一下功能需求場景 該提醒可以在頁面上進行配置多個,比如可以配置一個提醒:在每天的12點,傳送郵件給某個人,可以繼續配置另外一個提醒:在每個月的10號,給某個人
springboot整合quartz,生成的job由spring管理可直接注入
pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifac
springBoot整合Quartz案例
現在有很多工排程框架,比如Jfinal-Quartz、elastic-job、EasySchedule 、Quartz 等,最常用的就是Quartz 和elastic-job,這兩個框架各有各的好處,Quartz 可以滿足複雜的任務排程,並且spring框架對Qua
【轉載】SpringBoot整合Quartz定時任務
Quartz是完全基於Java的,可用於進行定時任務排程的開源框架,Scheduler是Quartz的大腦,所有任務都是由它來控制。那什麼時候用到Quartz呢,比如現在寫一個介面,公司需要每10分鐘呼叫一次,我們就可以用Quartz。 1.新增SpringBoot整合
SpringBoot整合Quartz定時任務框架
1、quartz排程核心元素: Scheduler:任務排程器,是實際執行任務排程的控制器。在spring中通過SchedulerFactoryBean封裝起來。 Trigger:描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和CronT
Spring Boot2.x 整合quartz叢集
springboot2.x支援對quartz的自動配置,引入jar <!-- spring boot2.x + quartz --> <dependency> &
springboot 整合 quartz
1.建立一個springboot工程,選擇依賴。 2.標註啟動定時任務 @EnableScheduling 在啟動類中 package com.lzx.demo01; import org.springframework.boot.SpringApplication
springboot整合quartz配置多工
看了另外一個篇在springboot中使用java類配置quartz的部落格, 但是沒有多工的配置。 在這裡寫一個配置quartz多工的demo, 使用兩個任務, 使用SimpleTrigger和CronTrigger兩種觸發器, 最後一起註冊到Schedule
springboot整合quartz多工的配置
1.maven依賴 <!-- quartz 使用了該jar包PlatformTransactionManager類 --> <dependency> <groupId>org.springframework</groupId> &l