1. 程式人生 > >springBoot整合quartz叢集

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