动态定义quartz定时任务

记录自己写的代码,肯定有不对的地方,参阅的话仅供参考。
这个用的是quartz-2.2.2.jar版本,动态设置了定时任务。

public class TaskManager {
    private static  TaskManager instance ;
    private SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
    private TaskManager(){};

    public static TaskManager getInstance(){
        if(instance == null) instance = new TaskManager();
        return instance;
    }
    //添加job
    public void addJob(String jobName,String serviceName,String cronExpression,Map contextMap) throws Exception{
        Scheduler sched = schedFact.getScheduler(); 
        if(!sched.isStarted()) sched.start();
        JobDetail jobDetail = newJob(TaskJob.class)
                .withIdentity(jobName, Scheduler.DEFAULT_GROUP)
                .usingJobData("serviceName", serviceName)
                .build();
        for(Object key : contextMap.keySet()){
            jobDetail.getJobDataMap().put(key.toString(), contextMap.get(key));
        }
        Trigger trigger = newTrigger()
                .withIdentity(jobName+"Trigger", Scheduler.DEFAULT_GROUP)
                .withSchedule(cronSchedule(cronExpression))
                .forJob(jobDetail)
                .build();
        sched.scheduleJob(jobDetail, trigger);
    }
    //添加job
    public void addJob(String jobName,String serviceName,String cronExpression) throws Exception{
        Scheduler sched = schedFact.getScheduler(); 
        if(!sched.isStarted())  sched.start();
        JobDetail jobDetail = newJob(TaskJob.class)
                .withIdentity(jobName, Scheduler.DEFAULT_GROUP)
                .usingJobData("serviceName", serviceName)
                .build();
        Trigger trigger = newTrigger()
                .withIdentity(jobName+"Trigger", Scheduler.DEFAULT_GROUP)
                .withSchedule(cronSchedule(cronExpression))
                .forJob(jobDetail)
                .build();
        sched.scheduleJob(jobDetail, trigger);
    }
    //移除job
    public void removeJob(String jobName) throws Exception{
        Scheduler sched = schedFact.getScheduler(); 
        if(!sched.isStarted()) sched.start();
        sched.unscheduleJob(triggerKey(jobName + "Trigger", Scheduler.DEFAULT_GROUP));
        sched.deleteJob(jobKey(jobName, Scheduler.DEFAULT_GROUP));
    }
}

下面是要执行的job,写任务的逻辑

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();        
        String serviceName = dataMap.getString("serviceName");
        System.out.println(serviceName);
    }
}

下面是测试

public class TaskTest {
    public static void main(String[] args) throws Exception {
        TaskManager mm = TaskManager.getInstance();
        for(int i=0;i<5;i++){
            mm.addJob("测试"+i,"服务"+i, "0/10 * * * * ?");
        }
        Thread.sleep(100000);
    }
}

哦对,时间解析,我写了个简单的,仅供参考

public String transform(String month,String day,String week){  
        //month 范围 1-12 即1-12月
        //day 范围1-31 即1-31日 注意特殊月份2月28天 最好1-28
        //week 范围MON-SUN
        String result="";
        if (week==null || week.equals("")) { //week 每周一次 ,他选其他都必须为null
            if (month==null || month.equals("")) { 
                if (day==null || day.equals("")) {
                    result=DAY;
                }else{
                result="0 0 1 "+day+" * ?";
                }
            }else {
                result="0 0 1 "+day+" "+month+" ?";
            }
        }else{
            result="0 0 1 ? * "+week; //每周一次
        }
        return result;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值