任务调度知识点

任务调度

定时任务调度

定时任务调度在项目开发中是一种不可缺少的需求,在Java中,实现任务调度有三种方式,分别是jdk自带的任务定时工具Timer、Spring task、第三方组件Quartz,接下来细聊这三种方式。

方式一、Timer(JDK自带任务定时工具)
//        创建定时类
        Timer timer = new Timer();
//        创建任务类
        TimerTask timerTask = new TimerTask(){
            @Override
            public void run() {
                System.out.println("定时任务启动了"+ LocalDateTime.now());
            }
        };
//        开启任务
        timer.schedule(timerTask,new Date(),2000);

运行截图如下
任务调度知识点_第1张图片

方式二、Spring-task
步骤有三

1.须有springboot启动类
2.在启动类上添加注解@EnableScheduling以开启任务调度,编写任务类

@Component
public class text2 {

    @Scheduled(cron = "*/1 * * * * *")
    public void text2(){
        System.out.println("Spring-task开始执行"+ LocalDateTime.now());
    }
}

3.通过多任务及睡眠测试结论如下

@Scheduled(cron = "*/1 * * * * *")
    public void text1() throws InterruptedException {
        System.out.println("Spring-task开始执行1"+ LocalDateTime.now());
        Thread.sleep(5000);
    }
    @Scheduled(cron = "*/1 * * * * *")
    public void text2(){
        System.out.println("Spring-task开始执行2"+ LocalDateTime.now());
    }

结论
1.Spring-task执行任务按照单线程执行,也就是说任务串行执行,任务一未完成任务二不会执行。
2.单线程处理任务能力有限,不建议处理分布式架构任务调度。

Quartz(基于第三方插件)
步骤如下

引入相关依赖:

<dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-quartzartifactId>
dependency>

建立任务类实现Job接口,实现execute方法

public class test3 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Quarts执行了"+ LocalDateTime.now());
    }
}

在主方法中创建任务调度器

StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();

创建JobDetail实例并与任务类绑定,同时设置任务名称及组名称

JobDetail build = JobBuilder.newJob(test3.class)
                .withIdentity("job1","group1")
                .build();

创建Trigger实例,设置触发器名称及组名并设置每三秒执行一次

Trigger trigger = TriggerBuilder.newTrigger()
               .withIdentity("trigger1","group1")
               .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
               .build();

开启任务调度器

scheduler.scheduleJob(build,trigger);
       scheduler.start();
JobDetail

在创建Trigger实例和JobDetail实例时可以添加扩展数据,并在执行任务时,通过该类型参数获取所扩展的数据JobExecutionContext。

//添加
JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("param1","value1");
        jobDataMap.put("param2","value2");
        JobDetail jobDetail = JobBuilder.newJob(MyJob2.class)
                .withIdentity("job2","group1")
                .setJobData(jobDataMap).build();
//获取
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println("任务被执行了,任务参数:"+jobDataMap.get("param1")+","+jobDataMap.get("param2"));
SimpleTrigger(简单的一类触发器)

1.在指定时间段内,执行一次任务
2.在指定时间段内,循环执行任务

CronTrigger(基于日历任务调度器)

可以通过表达式来设置时间

你可能感兴趣的:(java)