quartz简单实现多任务并发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.scan.xxx.config.quartz;
 
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Slf4j
@Configuration
public class QuartzConfig {
    @Autowired
    private Scheduler scheduler;
    @Bean(name = "jobDetail")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(SchedulerTask task){
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        /*
         *  是否并发执行
         *  例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
         *  如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
         */
        jobDetail.setConcurrent(true);//设置并行
 
        jobDetail.setName("scheduler");// 设置任务的名字
        jobDetail.setGroup("scheduler_group");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
 
        /*
         * 这两行代码表示执行task对象中的scheduleTest方法。定时执行的逻辑都在scheduleTest。
         */
        jobDetail.setTargetObject(task);
 
        jobDetail.setTargetMethod("start");
        return jobDetail;
    }
 
    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
        tigger.setJobDetail(jobDetail.getObject());
        tigger.setCronExpression("0 0 12 * * ?");// 表示每天中午12点
        //tigger.set
        tigger.setName("myTigger");// trigger的name
        return tigger;
 
    }
 
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
        SchedulerFactoryBean schedulerFactoryBean1 = new SchedulerFactoryBean();
        //设置是否任意一个已定义的Job会覆盖现在的Job。默认为false,即已定义的Job不会覆盖现有的Job。
        schedulerFactoryBean1.setOverwriteExistingJobs(true);
        // 延时启动,应用启动5秒后  ,定时器才开始启动
        schedulerFactoryBean1.setStartupDelay(5);
        // 注册定时触发器
        schedulerFactoryBean1.setTriggers(cronJobTrigger);
        return schedulerFactoryBean1;
    }
    //多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger
    @Bean(name = "multitaskScheduler")
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        return bean;
    }
 
    /**
     * 根据任务名任务组删除
     */
 
 
}

  配置类

复制代码
package com.scan.xxx.controller.quartz;

import com.scan.xxx.config.quartz.QuartzConfig;
import com.scan.xxx.config.quartz.Task1;
import com.scan.xxx.config.quartz.Task2;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Slf4j
@Controller
public class QuartzController2 {
    @Resource(name = "multitaskScheduler")
    private Scheduler scheduler;
    @Autowired
    private QuartzConfig quartzConfig;

    JobDetail jobDetail;

    @ResponseBody
    @RequestMapping("/task1")
    public Object task1() throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法
        jobDetail = JobBuilder
                .newJob(Task1.class)

                .withIdentity("job1", "group1")
                .build();
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/11 * * * * ?");
        // 每3s执行一次
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);

        return "任务1";
    }

    @ResponseBody
    @RequestMapping("/task2")
    public Object task2() throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法
        jobDetail = JobBuilder.newJob(Task2.class).withIdentity("job2", "group1").build();
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");
        // 每3s执行一次
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);

        return "任务2";
    }

    @ResponseBody
    @RequestMapping("/taskDelete")
    public void taskDelete(String taskCode, String taskGroup) throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法

        delete(taskCode, taskGroup);
    }

    public void delete(String taskCode, String taskGroup) throws SchedulerException {
        JobKey jobKey = new JobKey(taskCode, taskGroup);
        log.info(jobKey.getName());
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            log.info("不存在job");
            return;
        }
        log.info("删除" + jobKey.toString());
        scheduler.deleteJob(jobKey);
    }
}
复制代码

实现类

 模拟2个业务类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.scan.xxx.config.quartz;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
import java.util.Date;
 
public class Task1 implements Job {
 
 
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String name = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("1111执行"+name+new Date());
    }
}

  

参考  https://blog.csdn.net/cjbfzxz/article/details/114116440

posted @   myWang  阅读(551)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示