十三、企业开发(2)

本章概要

  • 定时任务

13.2 定时任务

简单的定时任务可以直接通过 Spring 中的 @Scheduled 注解来实现,复杂的定时任务则可以通过集成 Quartz 来实现,下面分别介绍。

13.2.1 @Scheduled

1. 创建工程

创建 Spring Boot Web 项目,添加 Web 依赖即可,如下

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

2. 开启定时任务

在项目启动类上添加 @EnableScheduling 注解开启定时任务

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }
}

3. 配置定时任务

定时任务主要通过 @Scheduled 注解进行配置,如下

@Component
public class MySchedule {
    @Scheduled(fixedDelay = 1000)
    public void fixedDelay() {
        System.out.println("fixedDelay:"+new Date());
    }
    @Scheduled(fixedRate = 2000)
    public void fixedRate() {
        System.out.println("fixedRate:"+new Date());
    }
    @Scheduled(initialDelay = 1000,fixedRate = 2000)
    public void initialDelay() {
        System.out.println("initialDelay:"+new Date());
    }
    @Scheduled(cron = "0 * * * * ?")
    public void cron() {
        System.out.println("cron:"+new Date());
    }
}

代码解释:

  • 通过 @Scheduled 注解来标注一个定时任务,其中 fixedDelay = 1000 表示在当前任务执行结束1秒后开启另一个任务,fixedRate = 2000 表示在当前任务开始执行2秒后开启另一个定时任务,initialDelay = 1000 则表示首次执行的延迟时间
  • 在 @Scheduled 注解中也可使用 cron 表达式,cron = “0 * * * * ?” 表示该定时器每分钟执行一次

配置完成,接下来启动 Spring Boot 项目即可,部分打印日志如下

initialDelay:Tue Aug 16 17:35:59 CST 2022
fixedDelay:Tue Aug 16 17:35:59 CST 2022
cron:Tue Aug 16 17:36:00 CST 2022
fixedRate:Tue Aug 16 17:36:00 CST 2022
fixedDelay:Tue Aug 16 17:36:00 CST 2022
initialDelay:Tue Aug 16 17:36:01 CST 2022
fixedDelay:Tue Aug 16 17:36:01 CST 2022
fixedRate:Tue Aug 16 17:36:02 CST 2022
fixedDelay:Tue Aug 16 17:36:02 CST 2022
initialDelay:Tue Aug 16 17:36:03 CST 2022
fixedDelay:Tue Aug 16 17:36:03 CST 2022
fixedRate:Tue Aug 16 17:36:04 CST 2022
fixedDelay:Tue Aug 16 17:36:04 CST 2022
initialDelay:Tue Aug 16 17:36:05 CST 2022
fixedDelay:Tue Aug 16 17:36:05 CST 2022
fixedRate:Tue Aug 16 17:36:06 CST 2022

13.2.2 Quartz

1. Quartz 简介

Quartz 是一个功能丰富的开源作业调度库,它由 Java 写成,可以集成在任何 Java 应用程序总,包括 Java SE 和 Java EE 等。
使用 Quartz 可以创建简单或者复杂的执行计划,它支出数据库、集群、插件以及邮件,并且支持 cron 表达式,具有极高的灵活性。
Spring Boot 中集成 Quartz 和 Spring 中集成 Quartz 比较类似,主要提供三个 Bean :JobDetail、Trigger 以及 SchedulerFactory。

2. 整合 Spring Boot

首先创建 Spring Boot 项目,添加 Quartz 依赖

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

然后创建两个 Job

@Component
public class MyFirstJob {
    public void sayHello() {
        System.out.println("MyFirstJob:sayHello:"+new Date());
    }
}
public class MySecondJob extends QuartzJobBean {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    @Override
    protected void executeInternal(JobExecutionContext context){
        System.out.println("hello:"+name+":"+new Date());
    }
}

Job 可以是一个普通的 JavaBean ,如果是普通的 Java Bean ,那么可以先添加 @Component 注解将其注册到 Spring 容器中。
Job 也可以继承抽象类 QuartzJobBean ,若继承 QuartzJobBean ,则需要实现该类中的 executeInternal 方法,该方法在任务被调用时使用。
接下来创建 QuartzConfig 对 JobDetail 和 Tigger 进行配置,如下

@Configuration
public class QuartzConfig {
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail1() {
        MethodInvokingJobDetailFactoryBean bean =
                new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }
    @Bean
    JobDetailFactoryBean jobDetail2() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MySecondJob.class);
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","sang");
        bean.setJobDataMap(jobDataMap);
        bean.setDurability(true);
        return bean;
    }
    @Bean
    SimpleTriggerFactoryBean simpleTrigger() {
        SimpleTriggerFactoryBean bean =
                new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail1().getObject());
        bean.setRepeatCount(3);
        bean.setStartDelay(1000);
        bean.setRepeatInterval(2000);
        return bean;
    }
    @Bean
    CronTriggerFactoryBean cronTrigger() {
        CronTriggerFactoryBean bean =
                new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetail2().getObject());
        bean.setCronExpression("* * * * * ?");
        return bean;
    }
    @Bean
    SchedulerFactoryBean schedulerFactory() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        SimpleTrigger simpleTrigger = simpleTrigger().getObject();
        CronTrigger cronTrigger = cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
}

代码解释:

  • JobDetail 的配置有两种方式:第一种通过 MethodInvokingJobDetailFactoryBean 类配置 JobDetail ,只需要指定 Job 的实例名和要调用的方法即可,注册这种方式无法在创建 JobDetail 时传递参数;第二种方式是通过 JobDetailFactoryBean 来实现的,这种方式只需要指定 JobClass即可,然后可以通过 JobDataMap 传递参数到 Job 中,Job 中只需要提供属性名,并且提供一个相应的 set 方法即可接收到参数
  • Trigger 有多种不同实现,这里展示两种常用的 Trigger :SimpleTrigger 和 CronTrigger,这两种分别使用 SimpleTriggerFactoryBean 和 CronTriggerFactoryBean 进行创建。在 SimpleTriggerFactoryBean 对象中,首先设置 JobDetail ,然后通过 setRepeatCount 配置任务循环次数,setStartDelay 配置任务启动延迟时间,setRepeatInterval 配置任务的时间间隔。在 CronTriggerFactoryBean 则主要配置 JobDetail 和 Cron 表达式
  • 最后通过 SchedulerFactoryBean 创建 SchedulerFactory ,然后配置 Trigger 即可

然后启动项目,控制台打印日志如下:

MyFirstJob:sayHello:Tue Aug 16 18:01:21 CST 2022
hello:sang:Tue Aug 16 18:01:22 CST 2022
hello:sang:Tue Aug 16 18:01:23 CST 2022
MyFirstJob:sayHello:Tue Aug 16 18:01:23 CST 2022
hello:sang:Tue Aug 16 18:01:24 CST 2022
hello:sang:Tue Aug 16 18:01:25 CST 2022
MyFirstJob:sayHello:Tue Aug 16 18:01:25 CST 2022
hello:sang:Tue Aug 16 18:01:26 CST 2022
hello:sang:Tue Aug 16 18:01:27 CST 2022
MyFirstJob:sayHello:Tue Aug 16 18:01:27 CST 2022
hello:sang:Tue Aug 16 18:01:28 CST 2022
hello:sang:Tue Aug 16 18:01:29 CST 2022
hello:sang:Tue Aug 16 18:01:30 CST 2022
hello:sang:Tue Aug 16 18:01:31 CST 2022

MyFirstJob 在重复了 3 次之后便不再执行,MySecondJob 则每秒执行一直,一直执行下去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小熊猫呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值