【springboot开发】定时任务

文章介绍了SpringBoot中实现定时任务的两种方式:使用@Scheduled注解和集成Quartz定时器。@Scheduled适合简单的定时任务,而Quartz提供更高级的功能,如持久化、任务管理和集群支持。文中详细展示了如何配置和使用这两个方法,包括SimpleJob和Cron定时任务的创建。
摘要由CSDN通过智能技术生成

前言:springboot提供了两种实现定时任务的方法,@scheduled注解和Quartz。前者适用于简单的定时任务,Quartz方法更加灵活多变。

1. @Scheduled注解

在启动类添加@EnableScheduling

@SpringBootApplication
@EnableCaching  // 开启缓存
@EnableScheduling	// 开启定时
public class BuildBaseFrameApplication {

    private static ApplicationContext context;

    public static ApplicationContext getContext() {
        return context;
    }

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

}

定义schedule任务,这里使用cron表达式,每隔10s执行一次:

@Component
public class SchedulerTask {

    private static final Logger loggger = LoggerFactory.getLogger(SchedulerTask.class);

    @Scheduled(cron = "*/10 * * * * ?")
    private void taskCron(){
        SimpleDateFormat dataFormat = new SimpleDateFormat("HH:mm:ss");

        loggger.info("现在时间 schedule: " + dataFormat.format(new Date()));
    }
}

除此外还可以用@Scheduled(fixedRate=10000)指定时间间隔是10s。
在这里插入图片描述

2. Quartz定时器

2.1 Quartz介绍

2.1.1 主要功能

  • 持久化:把任务和状态持久化到数据库
  • 任务管理:对调度任务进行有效管理
  • 集群:借助关系数据库和JDBC任务存储支持集群

2.1.2 基本概念

  • Job:接口,在实现接口的execute方法中编写任务
  • JobDetail:任务实现类
  • Trigger:描述触发任务执行的时间触发规则
  • Scheduler:接口,承载任务和触发器
    在这里插入图片描述

2.2 Springboot集成

Springboot中实现Quartz有两种方法:SimpleJob和CronSchedule。不用在启动类上使用@EnableScheduling。

2.2.1 添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2.2.2 SimpleJob

(1)创建Job
在executeInternal中定义任务内容。

public class SimpleJob extends QuartzJobBean {
     private static final Logger logger = LoggerFactory.getLogger(SimpleJob.class);

     private String name;

     public void setName(String name){
         this.name = name;
     }

     @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
         logger.info("Hello"+this.name);

     }
}

(2)创建scheduler
里面包含一个JobDetail和Trigger,把(1)中定义的任务内容放入JobDetail,然后在Trigger中定义触发规则。

@Configuration
public class SimpleSchedule {
    @Bean
    public JobDetail simpleJobDetail(){
        return JobBuilder.newJob(SimpleJob.class)
                .withIdentity("simplejob")  // 用于标识区分不同的job
                .usingJobData("name","test")    // 动态传入Job任务中的参数
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger simpleJobTrigger(){
        SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)  // 每十秒触发
                .repeatForever();

        return TriggerBuilder.newTrigger()
                .forJob(simpleJobDetail())
                .withIdentity("simpleTrigger")
                .withSchedule(simpleScheduleBuilder)
                .build();
    }
}

运行结果:
在这里插入图片描述

2.2.3 Cron定时任务

(1)定义Job
这一步和SimpleJob是一样的

public class CronJob extends QuartzJobBean {
    private static final Logger logger = LoggerFactory.getLogger(SimpleJob.class);

    private String name;

    public void setName(String name){
        this.name = name;
    }

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        logger.info("Hello! "+this.name);

    }
}

(2)创建scheduler
和simplejob唯一的区别是trigger设置时间间隔用的是Cron表达式

@Configuration
public class CronSchedule {
    @Bean
    public JobDetail cronJobDetail(){
        return JobBuilder.newJob(CronJob.class)
                .withIdentity("cronjob")  // 用于标识区分不同的job
                .usingJobData("name","cronTest")    // 动态传入Job任务中的参数
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger simpleJobTrigger(){
        CronScheduleBuilder scheduleBuilder= CronScheduleBuilder.cronSchedule("0/10 * * * * ?");

        return TriggerBuilder.newTrigger()
                .forJob(cronJobDetail())
                .withIdentity("simpleTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值