您的位置 首页 java

Java,任务调度,定时任务,Timer和Quartz框架

Timer&TimerTask

java.util.Timer:

一个实用工具类,用来调度一个线程,调度一个任务运行一次,或定期运行。

java.util.TimerTask:

实现了Runnable接口。

调度方法(java.util.Timer,delay–>延迟,period–>间隔):

public void schedule(TimerTask task, long delay)

public void schedule(TimerTask task, Date time)

public void schedule(TimerTask task, long delay, long period)

public void schedule(TimerTask task, Date firstTime, long period)

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

Quartz,定时任务框架

OpenSymphony开源组织在Job Scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务。

类似于java.util.Timer,但是相较于Timer, 增加了很多功能:1、持久性作业 – 就是保持调度定时的状态;2、作业管理 – 对调度作业进行有效的管理;

Quartz中的主要概念:

Scheduler:调度任务的主要API;

ScheduleBuilder:用于构建Scheduler,例如其简单实现类SimpleScheduleBuilder;

Job:调度任务执行的接口,也即定时任务执行的方法;

JobDetail:定时任务作业的实例;

JobBuilder:关联具体的Job,用于构建JobDetail;

Trigger:定义调度执行计划的组件,即定时执行;

TriggerBuilder:构建Trigger;

Timer&TimerTask代码:

 package com.what21.boot.timer.demo;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo {

    static class SimpleTimeTask extends TimerTask {

        private String name;

        public SimpleTimeTask(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println(this.name + "->currentTime->" + System.currentTimeMillis());
        }
    }

    public static void main(String[] args) {
        Timer timer = new Timer();
        // =======================================================================//
        // delayTime毫秒后开始执行任务
        TimerTask simpleTimeTask = new SimpleTimeTask("delayTime毫秒后开始执行任务");
        long delayTime = 1000;
        timer.schedule(simpleTimeTask, delayTime);
        // =======================================================================//
        // 具体日期(时间)开始执行任务
        long delayTime2 = 1000;
        TimerTask simpleTimeTask2 = new SimpleTimeTask("具体时间开始执行任务");
        timer.schedule(simpleTimeTask2, new Date(System.currentTimeMillis() + delayTime2));
        // =======================================================================//
        // 在指定的延时后执行任务,之后每隔periodTime毫秒重复执行。
        TimerTask simpleTimeTask3 = new SimpleTimeTask("每隔periodTime毫秒重复执行");
        long periodTime3 = 2000;
        timer.schedule(simpleTimeTask3, new Date(), periodTime3);
        TimerTask simpleTimeTask4 = new SimpleTimeTask("每隔periodTime毫秒重复执行2");
        long delayTime4 = 1000;
        long periodTime4 = 2000;
        timer.scheduleAtFixedRate(simpleTimeTask4, delayTime4, periodTime4);
        TimerTask simpleTimeTask5 = new SimpleTimeTask("每隔periodTime毫秒重复执行3");
        long delayTime5 = 1000;
        Date firstTime5 = new Date(System.currentTimeMillis() + delayTime5);
        long periodTime5 = 2000;
        timer.scheduleAtFixedRate(simpleTimeTask5, firstTime5, periodTime5);
        // =======================================================================//
    }

}
  

Quartz代码:

 package com.what21.boot.timer.demo;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class MyScheduler {

    public static class MyJob implements Job {

        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
            System.out.println("MyJob start at:" + printTime + ", Hello Job-" + new Random().nextInt(100));
        }

    }

    public static void main(String[] args) throws SchedulerException {
        // 1、创建调度器Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("job1", "group1").build();
        // 3、构建Trigger实例,每隔1s执行一次
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startNow() // 立即生效
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(1)// 每隔1s执行一次
                        .repeatForever()).build();// 一直执行
        //4、执行
        scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("--------scheduler start ! ------------");
        scheduler.start();
        //睡眠
        try {
            TimeUnit.MINUTES.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        scheduler.shutdown();
        System.out.println("--------scheduler shutdown ! ------------");
    }

}
  

SpringBoot整合Quartz代码:

 <!--quartz定时调度依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>  
 package com.what21.boot.quartz.config;

import com.what21.boot.quartz.task.MyQuartzJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfigure {

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(MyQuartzJob.class).storeDurably().build();
    }

    @Bean
    public Trigger trigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1) //每一秒执行一次
                .repeatForever(); //永久重复,一直执行下去
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withSchedule(scheduleBuilder)
                .build();
    }

}  
 package com.what21.boot.quartz.task;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyQuartzJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("QuartzJob1----" + sdf.format(new Date()));
    }

}
  
 package com.what21.boot.quartz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class BootQuartzApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootQuartzApplication.class);
    }

}
  

文章来源:智云一二三科技

文章标题:Java,任务调度,定时任务,Timer和Quartz框架

文章地址:https://www.zhihuclub.com/177958.shtml

关于作者: 智云科技

热门文章

网站地图