@Scheduled,Quartz,XXL-Job三种定时任务总结

@Scheduled,Quartz,XXL-Job三种定时任务总结

一、@Scheduled

  1. 简介

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

  2. 代码示例

    首先建好一个Spring Boot项目,写一个Service方法,再方法上加上注解@Scheduled,通过cron表达式来指定什么时候执行该方法(可以在网上搜索在线cron表达式生成器),下面的cron表达式表示的就是项目启动后,每5秒执行一次该方法

    @Service
    public class TimerServiceImpl implements ITimerService {
        @Override
        @Scheduled(cron = "0/5 * * * * ?")
        public void testScheduled() {
            //每5秒执行一次
            System.out.println("我执行了一次testScheduled()");
        }
    }
    

    还有一点,需要在启动类上面加上@EnableScheduling注解开启Spring的任务调度功能

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

    项目启动后,你就能看到控制台每5秒就会打印一句话了

    image-20231204192327932

二、Quartz

  1. 简介

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

  2. 代码示例

    pom.xml中导入依赖

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

    创建一个定时器任务,实现QuartzJobBean接口的方法

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

    创建一个配置类,构建定时任务触发器

    @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();
        }
    }
    

    项目启动后,你就能看到控制台每5秒就会打印一句话了

    image-20231204194341910

无论是@Scheduled,还是Quartz实现的定时任务,其实都只适合于单台服务器,试想,如果是分布式项目,多台服务器呢?在分布式项目中,多台服务器同时执行定时任务可能会导致数据重复写入的问题,因此需要考虑采取措施来确保定时任务的唯一性和一致性,而接下来要讲的XXL-Job就能解决这个问题。

三、XXL-Job

  1. 简介

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

  2. 安装

    这里我们使用docker-compose安装它的docker版

    查找镜像,我们选择这个STARS最多的xuxueli/xxl-job-admin

    [root@woniu ~]# docker search xxl-job
    NAME                                              DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
    vulhub/xxl-job                                                                                     1
    xuxueli/xxl-job-admin                             A lightweight distributed task scheduling fr…   150
    robotjerry/xxl-job-executor                                                                        0
    

    建一个目录xxl-job,在它下面建一个logs目录和一个docker-compose.yml文件

    [root@woniu xxl-job]# pwd
    /usr/local/software/xxl-job
    [root@woniu xxl-job]# ls
    docker-compose.yml  logs
    

    编辑docker-compose.yml(这个build: .是读取当前目录下的Dockerfile构建镜像用的,这里没有Dockerfile,所以我注释了)

    version: '2'
    #自定义的docker网络
    networks:
      wn_docker_net:
        external: true
    services:
      xxl-job-compose:
        #读取Dockerfile
        #build: .
        #镜像名称
        image: xuxueli/xxl-job-admin:2.3.1
        #容器名称
        container_name: xxl-job
        ports:
          - '9898:8080'
        environment:
          PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.102.100: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:
          wn_docker_net:
            ipv4_address: 172.18.12.100
    

    去官网https://www.xuxueli.com/xxl-job/的github或gitee里的doc/db目录下找到建库语句tables_xxl_job.sql建数据库

    image-20231204201205745

    docker-compose up -d后台构建执行

    image-20231204201300990

    浏览器输入(ip用你自己虚拟机的ip)192.168.102.100:9898/xxl-job-admin,用户名admin密码123456

    image-20231204201440633image-20231204201451880

  3. Spring Boot整合XXL-Job

    pom.xml导入依赖

    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    配置application-dev.yml(在application.yml里激活dev),进行一些执行器的配置

    server:
      port: 13000
    
    #xxljob的配置
    xxl:
      job:
        admin:
          addresses: http://192.168.102.100:9898/xxl-job-admin/
        executor:
          appname: xxl-job-executor-sample
          port: 9777
        accessToken: default_token
    
    logging:
      level:
        com.wnhz.ssc: debug
    

    创建XxlJobConfig配置类,配置执行器组件

    @Configuration
    @Slf4j
    public class XxlJobConfig {
    
        @Value("${xxl.job.admin.addresses}")
        private String addresses;
        @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 xxlJobExecutor() {
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAdminAddresses(addresses);
            xxlJobSpringExecutor.setAppname(appName);
            xxlJobSpringExecutor.setPort(port);
            xxlJobSpringExecutor.setAccessToken(accessToken);
            log.debug("xxl-job初始化成功:{}", xxlJobSpringExecutor);
            return xxlJobSpringExecutor;
        }
    }
    

    创建定时任务(记住@XXlJob中的值hellXxl,之后要用到)

    @Component
    @Slf4j
    public class MyJobs {
    
        @XxlJob("hellXxl")
        public void hellXxlJob() {
            log.debug("hello,xxl-job");
        }
    }
    

    在XXL-Job任务调度中心中的任务管理中添加任务

    image-20231204202742415

    点击启动(别忘了启动你的Spring Boot项目),然后你就可以在控制台上看到每5秒打印一句话了

    image-20231204202907521

    image-20231204203033319

四、总结

总的来说,如果只需要简单的定时任务调度,可以使用@Scheduled注解;如果需要更复杂的调度需求和企业级应用,可以选择Quartz;如果系统是一个大规模的分布式系统,需要分布式任务调度平台,那么XXL-Job是一个更好的选择。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Scheduled和@XxlJob:定时任务调度的区别》 在Java中,`@Scheduled` 和 `@XxlJob` 都是用来实现定时任务调度的功能,但它们分别对应于Spring框架中的内置注解和第三方开源库XXL-JOB。 1. **@Scheduled(Spring框架)**: - `@Scheduled` 是Spring框架的一部分,用于声明在Spring容器中运行的方法应该是周期性的执行。它通常用于简单的时间间隔调度,如每分钟、每小时或每天的特定时间。`@Scheduled` 允许你设置精确的cron表达式,提供了灵活的时间调度能力。 - 使用场景:适合轻量级的应用,尤其是那些已经使用Spring Boot构建的应用,它与Spring的依赖注入、AOP等特性结合紧密。 2. **@XxlJob(XXL-JOB)**: - XXL-JOB 是一个分布式任务调度平台,它提供了比`@Scheduled`更强大的功能,包括支持分布式部署、高并发处理、容错机制以及详细的日志跟踪等。 - 优点:适用于大型企业级应用,特别是当任务需要跨多个机器分发执行、有较高并发需求或者需要处理复杂的业务流程时。它提供了一种集中式的管理方式,便于维护和扩展。 - 使用场景:对于大规模、高并发的定时任务,或者是需要分布式处理的任务场景。 总结起来,`@Scheduled` 更侧重于基础的定时任务调度,而 `@XxlJob` 则是为了解决更复杂、分布式和高并发的定时任务需求而设计的。具体选择哪个取决于项目规模、复杂度以及团队的技术栈偏好。以下是相关问题:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值