栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring使用Quartz控制多组多任务的定时执行工具类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring使用Quartz控制多组多任务的定时执行工具类

pom依赖
        
            org.quartz-scheduler
            quartz
            2.2.1
        
Quartz管理工具类
package cn.com.baidu.util;

import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.quartz.*;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;


public class QuartzManager {

    //创建一个SchedulerFactory工厂实例
    private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();

    
    public static void addJob(String groupId, String taskId, String time, Map params) {
        try {
            Scheduler scheduler = gSchedulerFactory.getScheduler();
            JobDetail jobDetail= JobBuilder.newJob(SyncDataTask.class).withIdentity(taskId, groupId).build();
            jobDetail.getJobDataMap().put("params", params);
            CronTrigger trigger = (CronTrigger) TriggerBuilder
                    .newTrigger()
                    .withIdentity(taskId, groupId)
                    .withSchedule(CronScheduleBuilder.cronSchedule(time))
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            if (!scheduler.isShutdown()) {
                scheduler.start();// 启动
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("创建失败");
        }
    }

    
    public static void modifyJob(String groupId, String taskId, String time, Map params) {
        try {
            Scheduler scheduler = gSchedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }
            String oldTime = trigger.getCronexpression();
            if (!oldTime.equalsIgnoreCase(time)) {
                JobKey jobKey = JobKey.jobKey(taskId, groupId);
                JobDetail jobDetail = scheduler.getJobDetail(jobKey);
                Class objJobClass = jobDetail.getJobClass();
                removeJob(groupId, taskId);
                addJob(groupId, taskId, time, params);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("修改失败");
        }
    }

    
    public static void removeJob(String groupId, String taskId) {
        try {  
            Scheduler scheduler = gSchedulerFactory.getScheduler();  
            TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
            JobKey jobKey = JobKey.jobKey(taskId, groupId);
            scheduler.pauseTrigger(triggerKey);	// 停止触发器  
            scheduler.unscheduleJob(triggerKey);// 移除触发器
            scheduler.deleteJob(jobKey);		// 删除任务  
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("移除失败");
        }  
    }

    
    public static Boolean existsJob(String groupId, String taskId) {
        try {
            Scheduler scheduler = gSchedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(taskId, groupId);
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return false;
            }
            //获取trigger拥有的Job
            JobKey jobKey = trigger.getJobKey();
            JobDetailImpl jobDetail = (JobDetailImpl) scheduler.getJobDetail(jobKey);
            if(jobDetail.getName().equals(taskId)) {
                return true;
            }
        }catch(Exception e) {
            e.printStackTrace();
            throw new Exception("查询失败");
        }
        return false;
    }

    
    public static List> getJobList(String groupId) {
        List> jobList = new ArrayList<>();
        try {
            Scheduler scheduler = gSchedulerFactory.getScheduler();
            List triggerGroupNames = scheduler.getTriggerGroupNames();
            for (String groupName : triggerGroupNames) {
                if (!StringUtils.isEmpty(groupId)) {
                    if(!groupId.equals(groupName)) {
                        continue;
                    }
                }
                //组装group的匹配,为了模糊获取所有的triggerKey或者jobKey
                GroupMatcher groupMatcher = GroupMatcher.groupEquals(groupName);
                //获取所有的triggerKey
                Set triggerKeySet = scheduler.getTriggerKeys(groupMatcher);
                for (TriggerKey triggerKey : triggerKeySet) {
                    //通过triggerKey在scheduleruler中获取trigger对象
                    CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
                    //获取trigger拥有的Job
                    JobKey jobKey = trigger.getJobKey();
                    JobDetailImpl jobDetail = (JobDetailImpl) scheduler.getJobDetail(jobKey);
                    //组装需要显示的数据
                    Map jobMap = new HashMap<>();
                    //分组名称
                    jobMap.put("groupName", groupName);
                    //定时任务名称
                    jobMap.put("jobDetailName", jobDetail.getName());
                    //cron表达式
                    String cronexpression = trigger.getCronexpression();
                    jobMap.put("jobCronexpression", cronexpression);
                    //时区
                    jobMap.put("timeZone", trigger.getTimeZone().getID());
                    //下次运行时间
                    CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
                    cronTriggerImpl.setCronexpression(cronexpression);
                    List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 20);
                    jobMap.put("nextRunDateTime", new DateTime(dates.get(0)).toString("yyyy-MM-dd HH:mm:ss"));
                    jobList.add(jobMap);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("查询失败");
        }
        return jobList;
    }

    
    public static void startJobs() {  
        try {  
            Scheduler scheduler = gSchedulerFactory.getScheduler();  
            scheduler.start();  
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("全部启动失败");
        }  
    }  
  
    
    public static void shutdownJobs() {  
        try {  
            Scheduler scheduler = gSchedulerFactory.getScheduler();  
            if (!scheduler.isShutdown()) {  
                scheduler.shutdown();  
            }  
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("全部关闭失败");
        }
    }  
}  
Spring启动的时候通过数据库查询启动定时任务
package cn.com.baidu.util;

import cn.com.baidu.service.datasync.IDatasyncService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
        System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringUtil.applicationContext+"========");
        
        IDatasyncService iDatasyncService = getBean(IDatasyncService.class);
        iDatasyncService.initQuartzTask();
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static  T getBean(Class clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static  T getBean(String name,Class clazz){
        return getApplicationContext().getBean(name, clazz);
    }

}
Job定时实现类
package cn.com.baidu.util;

import org.quartz.*;
import java.util.Map;


@DisallowConcurrentExecution // 防止定时任务并行执行
public class SyncDataTask implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 取出任务参数
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        Map params = (Map) jobDataMap.get("params");
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号