zoukankan      html  css  js  c++  java
  • XXLJOB任务调度

    日常开发中难免会碰到需要开启定时任务处理业务。这时我们第一时间想到的是Spring的Task,但是很不方便,这里可以列出几点:

      1.一旦需要更改定时任务时间,我们就要打开IDE修改cron表达式;

      2.在特殊的情况下代码报错了,我们就要打开Log查看是什么导致的问题;

      3.需要很多定时任务去处理业务就要新建多个,突然不想执行这个任务了,我们就要再打开IDE注释那些代码。

                      就特别不好管理。

    可能又有人要说了:

      1.我可以用Redis进行动态修改cron表达式;-------- 看下面代码!!!

      2.我写个Aop,只要出现异常了我就记录相关信息;-------- 牛掰!Aop固然好,但是你觉得真的方便了吗?

      3.······我就是不闲麻烦,咋地。-------- 打扰了!!!

    package cn.chenghao.config;
    
    import lombok.AllArgsConstructor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    
    import javax.annotation.PostConstruct;
    
    /**
     * 自定义定时任务
     *
     * @Author chenghao
     * @Date 2020/4/14 11:56
     **/
    @Configuration
    @EnableScheduling
    @AllArgsConstructor
    public class CompleteScheduleConfig implements SchedulingConfigurer {
    
        /**
         * StringRedis模板
         */
        private final StringRedisTemplate stringRedisTemplate;
    
        /**
         * 初始化
         */
        @PostConstruct
        private void init() {
            // redis中不存在则创建
            stringRedisTemplate.opsForValue().setIfAbsent("cron", "0/3 * * * * ?");
        }
    
        /**
         * 配置任务
         */
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            // 给定cron表达式,触发Runnable任务
            scheduledTaskRegistrar.addTriggerTask(
                    () -> {
                        System.out.println("执行定时任务中.......");
                    },
                    triggerContext -> {
                        // 获取cron表达式
                        String cron = stringRedisTemplate.opsForValue().get("cron");
                        // 返回执行周期
                        return new CronTrigger(cron).nextExecutionTime(triggerContext);
                    });
        }
    }

    !(真的是太方便了) 

          

    ----------------------------------好,废话不再多说----------------------------------

    XXL-JOB地址:

      Gitee:https://gitee.com/xuxueli0323/xxl-job

      GitHub:https://github.com/xuxueli/xxl-job/

      XXL社区:https://www.xuxueli.com/xxl-job/

    概述:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

    首先将项目clone下来后,再打开社区文档,根据文档引导先将 doc/db/tables_xxl_job.sql 脚本在自己的数据库中执行

    确认无误后,再继续看文档:

     XXL-JOB分为三个大模块:调度中心、公共依赖、执行器

    首先我们根据文档引导,配置调度中心

    /xxl-job/xxl-job-admin/src/main/resources/application.properties

    想想还是截个图:

    相应配置完成后,直接运行admin模块,浏览器输入:http://localhost:8080/xxl-job-admin     默认登录账号 admin/123456

    刚进去这首页我还是很吃惊的!!!

    调度器配置、运行都成功了现在我们就要新建个任务看看效果了,在这之前我们还要配置执行器,也就是执行任务的容器

    /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

    想来想去我又截了:

    配置好对应调度中心的信息后,我们在运行执行器

    运行没问题后,我们来新建个任务试试水:

    我们就先用GLUE模式试试吧

     

    保存完后,直接点击启动!!!

    看控制台:

    看日志:

    任何操作一目了然!!!

    现在我们知道了XXL-JOB的作用了,就在想怎么对接到自己的项目运行,其实想想就是将公共依赖模块移出来

    <!-- xxl-job 任务调度 -->
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
                <version>2.2.0</version>
            </dependency>

    随后根据clone下来项目中的springboot版本的执行器复制 application.properties 

    package cn.running.taskdispatchdemo.config;
    
    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import lombok.extern.java.Log;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 执行器配置
     *
     * @author chenghao
     * @createTime 2020/5/21
     */
    @Log
    @Configuration
    @ComponentScan(basePackages = "cn.running.taskdispatchdemo.handler")
    public class XxlJobConfig {
    
        @Value("${xxl.job.admin.addresses}")
        private String adminAddresses;
    
        @Value("${xxl.job.executor.appname}")
        private String appName;
    
        @Value("${xxl.job.executor.ip}")
        private String ip;
    
        @Value("${xxl.job.executor.port}")
        private int port;
    
        @Value("${xxl.job.accessToken}")
        private String accessToken;
    
        @Value("${xxl.job.executor.logpath}")
        private String logPath;
    
        @Value("${xxl.job.executor.logretentiondays}")
        private int logRetentionDays;
    
        @Bean(initMethod = "start")
        public XxlJobSpringExecutor xxlJobSpringExecutor() {
            log.info("》》》》》 XXL-JOB init 《《《《《");
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
            xxlJobSpringExecutor.setAppname(appName);
            xxlJobSpringExecutor.setIp(ip);
            xxlJobSpringExecutor.setPort(port);
            xxlJobSpringExecutor.setAccessToken(accessToken);
            xxlJobSpringExecutor.setLogPath(logPath);
            xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
    
            return xxlJobSpringExecutor;
        }
    
    }

    基本配置完成后,现在调度中心新增执行器,再启动我们新建的执行器保存后,稍微等待一点时间,就自动注册上去了!!!

    在调度中心页面新增个任务:

    缺少JobHandler 需要我们去新建

    package cn.running.taskdispatchdemo.handler;
    
    import com.xxl.job.core.biz.model.ReturnT;
    import com.xxl.job.core.handler.annotation.XxlJob;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    
    /**
     * 任务处理
     *
     * @author chenghao
     * @createTime 2020/5/21
     */
    @Component("myHandler")
    public class MyHandler {
    
        @XxlJob("demoJobHandler")
        public ReturnT<String> execute(String s) {
            System.out.println("任务执行成功,执行参数:" + s + "当前时间是:" + LocalDateTime.now());
            return ReturnT.SUCCESS;
        }
    }

    这样就ok了,重启执行器就行了。再启动任务

    看控制台:

    看日志:

    至此,我们再来看看首页的样子


    对您有帮助的话,请点个推荐,转载请注明出处!谢谢各位!!!
  • 相关阅读:
    曾今的代码系列——获取当天最大流水号存储过程
    曾今的代码系列——生产者消费者模式
    利用Microsoft.VisualBasic中TextFieldParser解析器把CSV格式倒入数据库
    曾今的代码系列——自己的分页控件+存储过程实现分页
    ASP.NET那点不为人知的事(四)
    SharePoint下用C#代码上传文档至文档库的子文件夹中
    Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:使用函数
    Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载
    这几天Colorbox让我寝食难安
    使用ASP.NET MVC3+EF+Jquery制作文字直播系统(四)——完成篇
  • 原文地址:https://www.cnblogs.com/runningA/p/13024198.html
Copyright © 2011-2022 走看看