• 十三、企业开发(2)


    本章概要

    • 定时任务

    13.2 定时任务

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

    13.2.1 @Scheduled

    1. 创建工程

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

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2. 开启定时任务

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

    @SpringBootApplication
    @EnableScheduling
    public class ScheduledApplication {
        public static void main(String[] args) {
            SpringApplication.run(ScheduledApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码解释:

    • 通过 @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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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.bootgroupId>
      <artifactId>spring-boot-starter-quartzartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    然后创建两个 Job

    @Component
    public class MyFirstJob {
        public void sayHello() {
            System.out.println("MyFirstJob:sayHello:"+new Date());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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;
        }
    }
    
    • 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

    代码解释:

    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

  • 相关阅读:
    web3时事粥报
    杂多酸离子液体[BMIM]3 PW12O40负载三乙烯四胺(TETA)功能化Fe3O4复合材料([BMIM]3 PW12O40/Fe3O4@TETA)
    linux C语言 socket的server、client 实现
    [nlp] 自然语言理解基准 ATIS Snips
    嵌入式处理趋势,第一部分:超集成MCU
    【机器学习5】无监督学习聚类
    Socket套接字
    Eureka处理流程
    静态HTML网页设计作品——仿京东-海贼王(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 wweb前端期末大作业
    RabbitMQ-死信队列、延迟队列(原生+springboot+插件实现)
  • 原文地址:https://blog.csdn.net/GXL_1012/article/details/126371669