spring 整合 Quartz 实现动态任务调度


spring版本4.1.2和quartz 2.2.1整合,实现持久化到数据库

先在spring中配置好scheduler;

<bean id="simpleJobListener" class="xxx.xxx.quartz.task.SimpleJobListener"/>
    <bean id="mapScheduler" lazy-init="false" autowire="no"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="configLocation" value="classpath:conf/quartz.properties"/>
        <property name="globalJobListeners">
            <list>
          <!-- job监听器 -->
                <ref bean="simpleJobListener"/>
            </list>
        </property>
        <property name="triggers">
            <list>
          <!-- 在这里配置定时任务调度器 -->
                <ref bean="testCornTrigger"/>
            </list>
        </property>
    </bean>

    <!-- 配置的JobDetai -->
    <bean id="testJobDetai" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- durability 表示任务完成之后是否依然保留到数据库,默认false   -->
        <property name="durability" value="false" />
        <property name="jobClass" value="xxx.xxx.quartz.task.TestJob" />
    </bean>
    <!-- 配置的JobDetai,基于corn的调度器 -->
    <bean id="testCornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="testJobDetai"/>
        <!-- 每天23点执行一次 -->
        <property name="cronExpression" value="0 0 23 * * ?"/>
    </bean>

quartz.properties文件配置

#==============================================================    
#Configure Main Scheduler Properties    
#==============================================================     
org.quartz.scheduler.instanceName = quartzScheduler
org.quartz.scheduler.instanceId = AUTO
  
#==============================================================    
#Configure JobStore    
#==============================================================   
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 10000
org.quartz.jobStore.dataSource = myDS
   
#==============================================================    
#Configure DataSource    
#==============================================================   
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL =${quartzdb.url}
org.quartz.dataSource.myDS.user =${quartzdb.user}
org.quartz.dataSource.myDS.password =${quartzdb.password}
org.quartz.dataSource.myDS.maxConnections = 30

#==============================================================    
#Configure ThreadPool    
#==============================================================   
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
simpleJobListener监听器的代码
package xxx.xxx.quartz.task;

import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;

import java.util.Date;

/**
 * 任务监听器
 * @author hjp
 *
 */
@Slf4j
public class SimpleJobListener implements JobListener {
    
    @Override
    public String getName() {
        return "defaultJobListener";
    }

    /**
     * 这个方法正常情况下不执行,但是如果当TriggerListener中的vetoJobExecution方法返回true时,那么执行这个方法.
     * 需要注意的是 如果方法(2)执行 那么(1),(3)这个俩个方法不会执行,因为任务被终止了嘛.
     * Called by the Scheduler when a JobDetail was about to be executed (an associated Trigger has occurred),
     * but a TriggerListener vetoed it's execution.
       */
    @Override
    public void jobExecutionVetoed(JobExecutionContext arg0) {
    }

    /**
     * 任务执行之前执行
     */
    @Override
    public void jobToBeExecuted(JobExecutionContext arg0) {
        log.info("定时器:" + arg0.getJobDetail().getKey().getName() + ",开始执行了...." + new Date());
    }

    /**
     * 任务执行完成后执行,jobException如果它不为空则说明任务在执行过程中出现了异常
     * Called by the Scheduler after a JobDetail has been executed, and be for the associated Trigger's triggered(xx) method has been called.
     */
    @Override
    public void jobWasExecuted(JobExecutionContext arg0, JobExecutionException arg1) {
        if(arg1 != null) {
            log.info("定时器:" + arg0.getJobDetail().getKey().getName() + ",执行出错了...." + arg1.getMessage());
        }
        log.info("定时器:" + arg0.getJobDetail().getKey().getName() + ",执行结束了...." + new Date());
    }

}

 

调用代码
package xxx.xxx.quartz.service.impl;

import xxx.xxx.core.util.DateUtils;
import xxx.xxx.quartz.service.QuartzService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.quartz.impl.triggers.SimpleTriggerImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.util.Date;
import java.util.Map;

/**
 * QuartzService
 * @author hjp
 *
 */
@Slf4j
@Service
public class QuartzServiceImpl implements QuartzService {

    @Autowired
    private Scheduler scheduler;
    
    private final static String groupName = "groupDefault";
    
    @Override
    public Date addJobOne(String jobName, Class<? extends Job> cls, Long time,Map<String,String> paramMap) {
        try {
            deleteJob(jobName);
            
            SimpleTriggerImpl trigger = new SimpleTriggerImpl();

            trigger.setStartTime(DateUtils.parentDate(System.currentTimeMillis() + time));
            TriggerKey triggerKey = new TriggerKey("Trigger_" + jobName, groupName);
            trigger.setKey(triggerKey);

            JobBuilder jb = JobBuilder.newJob(cls);
            jb.withIdentity(jobName, groupName);
            JobDataMap map = new JobDataMap();
            if(paramMap!= null) {
                for (String key : paramMap.keySet()) {
                    map.put(key, paramMap.get(key));
                }
            }
            jb.usingJobData(map);
            JobDetail job = jb.build();
            Date execDate = scheduler.scheduleJob(job, trigger);
            return execDate;
        } catch (SchedulerException e) {
            log.error(e.getMessage());
        }
        return null;
    }

    @Override
    public boolean deleteJob(String jobName) {
        JobKey jobKey = new JobKey(jobName, groupName);
        TriggerKey triggerKey = new TriggerKey("Trigger_" + jobName, groupName);

        try {
            if(scheduler.checkExists(jobKey)) {
                scheduler.pauseTrigger(triggerKey);
                scheduler.unscheduleJob(triggerKey);
                scheduler.deleteJob(jobKey);
                return true;
            }
        } catch (SchedulerException e) {
            log.error(e.getMessage());
        }
        return false;
    }

    @Override
    public Boolean isJobExist(String jobName) {
        try {
            JobKey jobKey = new JobKey(jobName, groupName);
            return scheduler.checkExists(jobKey);
        } catch (SchedulerException e) {
            log.error(e.getMessage());
        }
        return false;
    }

    /**
     * 添加一个定时器  通过cron确定时间
     * @param jobName
     * @param cls
     * @param cron
     * @param paramMap
     * @return
     */
    public Date addJob(String jobName, Class<? extends Job> cls, String cron,Map<String,String> paramMap) {
        try {
            JobBuilder jb = JobBuilder.newJob(cls);
            jb.withIdentity(jobName , groupName);
            JobDataMap map = new JobDataMap();

            if(paramMap != null) {
                for (String key : paramMap.keySet()) {
                    map.put(key, paramMap.get(key));
                }
            }

            jb.usingJobData(map);

            CronTriggerImpl trigger = new CronTriggerImpl();
            trigger.setCronExpression(cron);
            TriggerKey key = new TriggerKey("Trigger_" + jobName, groupName);
            trigger.setKey(key);

            return scheduler.scheduleJob(jb.build(), trigger);
        } catch (SchedulerException | ParseException e) {
            log.error(e.getMessage());
        }
        return null;
    }

}
 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM