Spring Boot与Quartz集成

4 篇文章 0 订阅

Spring Boot与Quartz集成

一、Quartz配置信息

1. Maven依赖

添加quartz的依赖

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz.version}</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>${quartz.version}</version>
        </dependency>

2. resources/quartz.properties文件

#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName:XXWS
org.quartz.scheduler.instanceId:XXWS
org.quartz.scheduler.skipUpdateCheck:true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount:5
org.quartz.threadPool.threadPriority:5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold:60000
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true
#============================================================================
# Other Example Delegates
#============================================================================
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v6Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v7Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DriverDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PointbaseDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.WebLogicDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/quartz?useSSL=false
org.quartz.dataSource.myDS.user:root
org.quartz.dataSource.myDS.password:root
org.quartz.dataSource.myDS.maxConnections:5
org.quartz.dataSource.myDS.validationQuery:select 0
#============================================================================
# Configure Plugins
#============================================================================
#org.quartz.plugin.shutdownHook.class: org.quartz.plugins.management.ShutdownHookPlugin
#org.quartz.plugin.shutdownHook.cleanShutdown: true
#org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin

3.建表脚本 db.sql

#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.

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;

二、与spring boot的集成

1.让Quartz的Job使用Spring注入的Bean

将Scheduler交给spring生成, 在spirng-context-support jar包下org.springframework.scheduling.quartz包中有个SpringBeanJobFactory的类实现SchedulerContextAware,因此添加依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

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;

/**
 * This JobFactory autowires automatically the created quartz bean with spring @Autowired dependencies.
 *
 * @author jelies (thanks to Brian Matthews: http://webcache.googleusercontent.com/search?q=cache:FH-N1i--sDgJ:blog.btmatthews.com/2011/09/24/inject-application-context-dependencies-in-quartz-job-beans/+&cd=7&hl=en&ct=clnk&gl=es)
 */
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;
    }
}

2. 从JobFactory中获取scheduler

import xx.quartz.AutowiringSpringBeanJobFactory;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Copyright: Copyright (c) 2016,${year},
 * @Description: ${todo}
 */

@Configuration
public class SchedulerConfig {
    @Autowired
    private ApplicationContext applicationContext;

    /**
     * config Scheduler
     *
     * @return
     */
    @Bean(name = "uniScheduler")
    public Scheduler getScheduler() {
        Scheduler scheduler = null;

        try {
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            //
            /**
             * custom job factory of spring with DI support for @Autowired!(可以在job中使用spring Bean)
             */
            AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
            jobFactory.setApplicationContext(applicationContext);
            scheduler.setJobFactory(jobFactory);
            //
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return scheduler;
    }
}

3. ScheduledJob.java 任务

import java.util.Date;

/**
 * This class represents a scheduled object in Quartz framework.
 * The object is used by the ScheduledJobsVO to encapsulate details of a
 * scheduled job during processing.
 */
public class ScheduledJob {

    /*
     * Variables to store the information for a scheduled job.
     */
    private String jobName = null;
    private String groupName = null;
    private Date nextExecution = null;
    private String jobClass = null;
    private String jobState = null;

    /**
     * Default constructor
     *
     * @param jobName       Name of the scheduled job
     * @param groupName     Group to which the scheduled job belongs to
     * @param nextExecution The time of next execution for the job
     * @param jobClass      Name of the class executed for the job
     * @param jobState      the status of the job
     */
    public ScheduledJob(String jobName, String groupName,
                        Date nextExecution, String jobClass, String jobState) {
        super();
        this.jobName = jobName;
        this.groupName = groupName;
        this.nextExecution = nextExecution;
        this.jobClass = jobClass;
        this.jobState = jobState;
    }

    /**
     * Setter for a variable.
     *
     * @param jobName value for the variable
     */
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    /**
     * Getter for a variable.
     *
     * @return value of the variable
     */
    public String getJobName() {
        return jobName;
    }

    /**
     * Setter for a variable.
     *
     * @param groupName value for the variable
     */
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    /**
     * Getter for a variable.
     *
     * @return value of the variable
     */
    public String getGroupName() {
        return groupName;
    }

    /**
     * Setter for a variable.
     *
     * @param nextExecution value for the variable
     */
    public void setNextExecution(Date nextExecution) {
        this.nextExecution = nextExecution;
    }

    /**
     * Getter for a variable.
     *
     * @return value of the variable
     */
    public Date getNextExecution() {
        return nextExecution;
    }

    /**
     * Setter for a variable.
     *
     * @param jobClass value for the variable
     */
    public void setJobClass(String jobClass) {
        this.jobClass = jobClass;
    }

    /**
     * Getter for a variable.
     *
     * @return value of the variable
     */
    public String getJobClass() {
        return jobClass;
    }

    public String getJobState() {
        return jobState;
    }

    public void setJobState(String jobState) {
        this.jobState = jobState;
    }

    @Override
    public String toString() {
        String nextExecutionFormatted = (null == nextExecution ? "null" : String.format("%tc", nextExecution));
        return jobName + " " + groupName + " " + nextExecutionFormatted + " " + jobClass;
    }


}

4. SchedulerService

import xx.bean.ScheduledJob;
import org.quartz.SchedulerException;

import java.util.List;

/**
 * Created by flowfire on 2017/2/28.
 */
public interface SchedulerService {
    int startup();

    boolean isStarted();

    int standby();

    int shutdown();

    List<ScheduledJob> getScheduledJobs();

    List<ScheduledJob> getCurrentlyExecutingJobs();

    void deleteScheduledJob(String jobName, String groupName);

    boolean scheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule);

    boolean scheduleJobWithDataOnce(String jobName, String jobGroup, String jobClassName, String[] keys, Object[] values);

    boolean scheduleJobWithData(String jobName, String jobGroup, String jobClassName, String cronSchedule, String[] keys, Object[] values);

    boolean rescheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule);

    boolean unscheduleJob(String jobName, String jobGroup);

    boolean pauseTrigger(String triggerName, String group) throws SchedulerException;

    boolean resumeTrigger(String triggerName, String group) throws SchedulerException;

    boolean removeTrigger(String triggerName, String group) throws SchedulerException;

    String getCronExpression(String triggerName, String group) throws SchedulerException;
}

impl

import xx.bean.ScheduledJob;
import xx.service.SchedulerService;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.quartz.impl.matchers.GroupMatcher.groupEquals;

/**
 * Created by flowfire on 2017/2/28.
 */
@Service("schedulerService")
public class SchedulerServiceImpl implements SchedulerService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Resource(name = "uniScheduler")
    Scheduler scheduler;

    /**
     * 开启任务调度
     *
     * @return
     */
    @Override
    public int startup() {
        try {
            if (scheduler.isInStandbyMode()) {//Standby Mode
                scheduler.start();
                return 1;
            } else if (scheduler.isStarted()) {
                return 0;
            } else {
                return -1;
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        return -1;
    }

    /**
     * 检查调度是否启动
     *
     * @return
     * @throws SchedulerException
     */
    @Override
    public boolean isStarted() {
        try {
            return scheduler.isStarted();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 使处于standby模式
     *
     * @return
     */
    @Override
    public int standby() {
        try {
            if (scheduler.isStarted()) { //Started Mode
                scheduler.standby(); //使处于standby模式
                return 1;
            } else if (scheduler.isInStandbyMode()) {// Standby Mode
                return 0;
            } else {
                return -1;
            }

        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return -1;
    }


    /**
     * 关闭任务调度
     *
     * @return
     */
    @Override
    public int shutdown() {

        try {
            if (scheduler.isStarted()) {//Started Mode
                scheduler.shutdown(true);//true:等任务结束后停止;default\false:立即停止但等任务执行完;
                return 1;
            } else if (scheduler.isInStandbyMode()) {//Standby-Mode
                scheduler.shutdown(false);
                return 1;
            } else {//Shutdown-Mode
                return -1;
            }

        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        return -1;
    }


    /**
     * Gets a list of scheduled jobs
     *
     * @return list of scheduler jobs
     */
    @Override
    public List<ScheduledJob> getScheduledJobs() {
        logger.info("QuartzSchedulerSingleton.getScheduledJobs Start ");
        List<ScheduledJob> result = new ArrayList<>();
        try {
            // Loop through the groups and all jobs for each group
            for (String groupName : scheduler.getJobGroupNames()) {
                for (JobKey jobKey :
                        scheduler.getJobKeys(groupEquals(groupName))) {

                    String jobName = jobKey.getName();
                    String jobGroup = jobKey.getGroup();

                    // Get the trigger for the job to determine next execution
                    List<Trigger> triggers =
                            (List<Trigger>) scheduler.getTriggersOfJob(jobKey);

                    // get the state from the triggerKey
                    Trigger.TriggerState triggerState = scheduler.getTriggerState(triggers.get(0).getKey());

                    Date nextFireTime = triggers.get(0).getNextFireTime();

                    // Get the JobDetail to obtain the name of the class for the job
                    JobDetail jobDetail = scheduler.getJobDetail(jobKey);

                    // Add a POJO object to the list containing the details of the scheduled jobs
                    ScheduledJob temp =
                            new ScheduledJob(jobName, jobGroup, nextFireTime,
                                    jobDetail.getJobClass().getName(), triggerState.name());
                    logger.info("QuartzSchedulerSingleton.getScheduledJobs job : " + temp);
                    result.add(temp);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        logger.info("QuartzSchedulerSingleton.getScheduledJobs result " + result);
        return result;
    }

    /**
     * Get Currently Executing Jobs
     *
     * @return
     */
    @Override
    public List<ScheduledJob> getCurrentlyExecutingJobs() {
        List<ScheduledJob> result = new ArrayList<>();
        try {
            List<JobExecutionContext> jobs = scheduler.getCurrentlyExecutingJobs();
            for (JobExecutionContext job : jobs) {
                JobDetail jobDetail = job.getJobDetail();
                JobKey jobKey = jobDetail.getKey();

                // Get the trigger for the job to determine next execution
                List<Trigger> triggers =
                        (List<Trigger>) scheduler.getTriggersOfJob(jobKey);

                // get the state from the triggerKey
                Trigger.TriggerState triggerState = scheduler.getTriggerState(triggers.get(0).getKey());

                Date nextFireTime = triggers.get(0).getNextFireTime();

                // Add a POJO object to the list containing the details of the scheduled jobs
                ScheduledJob temp =
                        new ScheduledJob(jobKey.getName(), jobKey.getGroup(), nextFireTime,
                                jobDetail.getJobClass().getName(), triggerState.name());

                result.add(temp);
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * Delete scheduled job
     *
     * @param jobName   name of the job to be deleted
     * @param groupName group name of the job to be deleted
     */
    @Override
    public void deleteScheduledJob(String jobName, String groupName) {
        logger.info("QuartzSchedulerSingleton.deleteScheduledJob Start; " + jobName + " " + groupName);
        try {
            // Construct the key for the job to be deleted
            JobKey jobKey = new JobKey(jobName, groupName);

            // Delete the job
            scheduler.deleteJob(jobKey);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        logger.info("QuartzSchedulerSingleton.deleteScheduledJob End ");
    }

    /**
     * Schedule a job
     *
     * @param jobName      name of the job to be scheduled
     * @param jobClassName class of the job to be schedule
     * @param cronSchedule the cron based schedule for the job
     */
    @Override
    public boolean scheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule) {
        logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
        try {
            Class jobClass = Class.forName(jobClassName);

            // Create the job
            JobDetail job =
                    JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();

            // Create a new cron based schedule
            Trigger trigger =
                    TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)).build();

            scheduler.scheduleJob(job, trigger);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("QuartzSchedulerSingleton.scheduleJob End ");
        return false;
    }

    /**
     * 仅执行一次任务(数据)
     *
     * @param jobName
     * @param jobGroup
     * @param jobClassName
     * @return
     */
    @Override
    public boolean scheduleJobWithDataOnce(String jobName, String jobGroup, String jobClassName, String[] keys, Object[] values) {
        logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName);
        try {
            Class jobClass = Class.forName(jobClassName);

            // Create the job
            JobDetail job =
                    JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
            //添加数据
            if (keys != null && values != null && keys.length == values.length) {
                for (int i = 0; i < keys.length; i++) {
                    job.getJobDataMap().put(keys[i], String.valueOf(values[i]));
                }
            }

            // Create a new cron based schedule
            SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(jobName, jobGroup)
                    .startAt(new Date())
                    .withSchedule(
                            SimpleScheduleBuilder.simpleSchedule()
                                    .withIntervalInSeconds(3)
                                    .withRepeatCount(0))//重复执行的次数,因为加入任务的时候马上执行了,所以不需要重复,否则会多一次。
                    .build();

            scheduler.scheduleJob(job, trigger);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("QuartzSchedulerSingleton.scheduleJob End ");
        return false;
    }

    /**
     * 运行任务(数据)
     *
     * @param jobName
     * @param jobGroup
     * @param jobClassName
     * @param cronSchedule
     * @param keys
     * @param values
     * @return
     */
    @Override
    public boolean scheduleJobWithData(String jobName, String jobGroup, String jobClassName, String cronSchedule, String[] keys, Object[] values) {
        logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
        try {
            Class jobClass = Class.forName(jobClassName);

            // Create the job
            JobDetail job =
                    JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
            //添加数据
            if (keys != null && values != null && keys.length == values.length) {
                for (int i = 0; i < keys.length; i++) {
                    job.getJobDataMap().put(keys[i], String.valueOf(values[i]));
                }
            }
            // Create a new cron based schedule
            Trigger trigger =
                    TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup).withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule)).build();

            scheduler.scheduleJob(job, trigger);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("QuartzSchedulerSingleton.scheduleJob End ");
        return false;
    }

    /**
     * ReSchedule a job
     *
     * @param jobName      name of the job to be scheduled
     * @param jobClassName class of the job to be schedule
     * @param cronSchedule the cron based schedule for the job
     */
    @Override
    public boolean rescheduleJob(String jobName, String jobGroup, String jobClassName, String cronSchedule) {
        logger.info("QuartzSchedulerSingleton.scheduleJob Start; " + jobName + " " + jobClassName + " " + cronSchedule);
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

        try {
            JobDetail jobDetail = scheduler.getJobDetail(jobKey);


            if (null == jobDetail) {//jobDetail as uniqueKey
                scheduleJob(jobName, jobGroup, jobClassName, cronSchedule);
            } else {
                // Get the trigger for the job to determine next execution
                List<Trigger> triggers =
                        (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
                if (null != triggers && triggers.size() > 0) {
                    CronTrigger trigger = (CronTrigger) triggers.get(0);

                    trigger = trigger.getTriggerBuilder()
                            .startNow()
                            .withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule))
                            .build();
                    scheduler.rescheduleJob(trigger.getKey(), trigger);

                }
            }
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        logger.info("QuartzSchedulerSingleton.scheduleJob End ");
        return false;
    }

    /**
     * 关闭任务
     *
     * @param jobName
     * @return
     */
    @Override
    public boolean unscheduleJob(String jobName, String jobGroup) {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
        try {
            List<Trigger> triggers =
                    (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
            if (null != triggers && triggers.size() > 0) {
                return scheduler.unscheduleJob(triggers.get(0).getKey());
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 暂停任务
     *
     * @param triggerName
     * @param group
     */
    @Override
    public boolean pauseTrigger(String triggerName, String group) throws SchedulerException {


        scheduler.pauseTrigger(new TriggerKey(triggerName, group));// 停止触发器
        return true;


    }

    /**
     * 恢复任务
     *
     * @param triggerName
     * @param group
     */
    @Override
    public boolean resumeTrigger(String triggerName, String group) throws SchedulerException {

        scheduler.resumeTrigger(new TriggerKey(triggerName, group));// 重启触发器
        return true;

    }

    /**
     * 移除任务
     *
     * @param triggerName
     * @param group
     * @return
     */
    @Override
    public boolean removeTrigger(String triggerName, String group) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(triggerName, group);

        scheduler.pauseTrigger(triggerKey);// 停止触发器
        return scheduler.unscheduleJob(triggerKey);// 移除触发器

    }

    /**
     * 获取时间表达式
     *
     * @param triggerName
     * @param group
     * @return
     */
    @Override
    public String getCronExpression(String triggerName, String group) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(triggerName, group);
        CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);

        return cronTrigger.getCronExpression();
    }


}

5. 任务类


import com.google.gson.Gson;



import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.IOException;

import java.util.*;


public class XXTask implements Job {
    private Logger log = LoggerFactory.getLogger(XXTask.class);

    @Autowired
    JdbcService jdbcService;


    @Override
    public void execute(JobExecutionContext jobExecutionContext)
            throws JobExecutionException {
        JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap();

        int id = dataMap.getInt("id");

        runjob(id);
    }


    /**
     * runjob
     *
     * @param id
     * @return
     */
    private int runjob(int id) {



        return 0;

    }



}

6. 任务调度


    @Autowired
    SchedulerService schedulerService;


    flag = schedulerService.scheduleJobWithDataOnce(jobName, jobGroup,
                    "xx", new String[]{"id"}, new Object[]{1});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值