三种定时器的实现方式

一、@Scheduled

@Schedule是Spring框架提供的一种简单的定时任务调度方法,通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求,例如每隔一段时间执行一次任务或者在特定时间执行任务。@Scheduled可以轻松地集成到Spring应用中,但在处理复杂地调度需求时可能显得不够灵活。

使用实例

  1. 在定时任务上添加注解

    java 复制代码
    @Service
    public class TimerServiceImpl implements ITimerService {
        @Override
        @Scheduled(cron = "0/5 * * * * ?")
        public void testScheduled() {
            //每5秒执行一次
            System.out.println("我执行了一次testScheduled()");
        }
    }
  2. 在启动类上通过 @EnableScheduling 注解开启spring的任务调度功能。

    bash 复制代码
    @SpringBootApplication
    @EnableScheduling
    public class JobApp {
        public static void main(String[] args) {
            SpringApplication.run(JobApp.class);
        }
    }

二、Quartz

Quartz是一个功能强大的、开源的定时任务调度框架,提供了丰富的功能和灵活的调度管理。它支持复杂的调度需求,作业持久化、集群部署等功能。Quartz可以与Spring等框架无缝集成,被广泛应用于企业级应用中,使用与单体服务,不适合分布式。

接下来简单介绍一下如何使用

2.1 引入依赖

xml 复制代码
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.2 创建一个定时器任务

实现 QuartzJobBean 的方法。

java 复制代码
public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("我是定时器quartz,准备运行...");
    }
}

2.3 构建定时器任务触发器

创建一个配置类

java 复制代码
@Configuration
public class JobConfig {
    @Bean
    public JobDetail jobDetail(){
        return JobBuilder.newJob(MyJob.class)
                .storeDurably(true)
                .build();
    }
    @Bean
    public Trigger trigger(){ //用于创建一个和先前创建的定时器任务关联起来的触发器,设置触发器时间为每隔5秒
       return  TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
    }
}

三、xxl-job

XXL-Job是一个分布式任务调度平台,提供了可视化的任务管理界面、任务的动态添加、修改、删除等功能。它支持分布式部署,并提供了任务执行日志、任务运行状态等监控功能。XXL-Job是为了解决分布式系统中任务调度的问题而设计的,适合于大规模分布式系统中的定时任务调度。

官网:https://www.xuxueli.com/xxl-job/

接下来简单介绍一下如何使用

3.1 安装

  1. 为了方便,使用 docker-compose 安装

    yml 复制代码
    version: '2'
    #自定义的docker网络
    networks:
      docker_net:
        external: true
    services:
      xxl-job-compose:
        #读取Dockerfile
        #build: 
        #  context: .
        #  dockerfile: Dockerfile文件名
        #镜像名称
        image: xuxueli/xxl-job-admin:2.3.1
        #容器名称
        container_name: xxl-job
        ports:
          - "9898:8080"
        environment:
          PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.201.81:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
                   --spring.datasource.username=root
                   --spring.datasource.password=123'
        volumes:
          - /usr/local/software/xxl-job/logs:/data/applogs
        networks:
          docker_net:
            ipv4_address: 172.18.12.100
  2. 加载数据库信息

    官方提供了数据库文件,我们只需要下载下来运行即可。

  3. 运行

    使用 docker-compose up -d 执行 docker-compose.yml 文件。

    启动成功后,浏览器输入http://虚拟机ip:9898/xxl-job-admin,出现下面的界面即表示运行成功。

    使用用户名 admin ,密码 123456 登录。

3.2 xxl-job编程

  1. 引入依赖

    xml 复制代码
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.3.1</version>
    </dependency>
  2. yml 文件中配置

    yml 复制代码
    #xxljob的配置
    xxl:
      job:
        admin:
          addresses: http://192.168.200.135:9898/xxl-job-admin
        executor:
          appname: xxl-job-executor-sample
          port: 9777
        accessToken: default_token

    appname的名称从下面这里获取。 3. java 配置类

    java 复制代码
    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    @Slf4j
    @Configuration
    public class XxlJobConfig {
        @Value("${xxl.job.admin.addresses}")
        private String address;
        @Value("${xxl.job.executor.appname}")
        private String appName;
        @Value("${xxl.job.executor.port}")
        private int port;
        @Value("${xxl.job.accessToken}")
        private String accessToken;
        @Bean
        public XxlJobSpringExecutor xxlJobSpringExecutor(){
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAccessToken(accessToken);
            xxlJobSpringExecutor.setAdminAddresses(address);
            xxlJobSpringExecutor.setAppname(appName);
            xxlJobSpringExecutor.setPort(port);
            log.debug("xxl-job初始化成功:{}",xxlJobSpringExecutor);
            return xxlJobSpringExecutor;
        }
    }
  3. 创建调度任务

    java 复制代码
    @Component
    @Slf4j
    public class MyJobs {
        @XxlJob("helloXxl")
        public void helloXxlJob(){
            log.debug("hello,xxljob");
        }
    }
  4. web 管理端配置

    配置任务:任务管理 -> 新增,根据实际情况填写内容,注意 JobHandler内容需要与创建的调度任务注解名称保持一致。

  5. 测试

    点击新建任务右侧的操作,来执行代码。

相关推荐
公贵买其鹿16 分钟前
List深拷贝后,数据还是被串改
java
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp6 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea