zoukankan      html  css  js  c++  java
  • Springboot项目整合xxl -job

    转自:https://www.icode9.com/content-4-632031.html

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

         首先下载github源码:https://github.com/xuxueli/xxl-job

         本文以2.2.0-SNAPSHOT开发测,如果需要下载对应版本:https://github.com/itwsj/xxl-job

         代码目录结构:

    将doc目录下的db文件夹中的数据库脚本在mysql数据库中执行,生成xxl相应的一些基础表。

    修改xxl-job-admin下的application.properties文件,将数据库链接改成自己的数据库对应的url,最重要的是要指定服务端口以及上下文的名称。

     然后配置mysql链接和对应驱动,圈住的地方需要加上,要不然会报错时间区域和驱动链接错误

    serverTimezone=UTCcom.mysql.cj.jdbc.Driver

    然后启动项目,也可以将项目打包成jar文件。

    访问后台管理页面

    输入地址:localhost:8080/job 用户名:admin 密码 123456

    在自己的springboot项目中,集成xxl-job:
    在配置文件中加入以下配置:

    (1)在pom.xml引入xxl-job的依赖

     <!-- xxl-job-core -->
       <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.2.0-SNAPSHOT</version>
       </dependency>

    (2)在application.yml/application.properties中配置相关信息

    1、配置后台管理端地址
    2、appname值非常重要,配置执行器需要和这个保持一直

    # web port
    server.port=8081
    
    # log config
    logging.config=classpath:logback.xml
    
    
    ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
    xxl.job.admin.addresses=http://127.0.0.1:8080/job
    
    ### xxl-job executor address
    xxl.job.executor.appname=myapp
    xxl.job.executor.ip=
    xxl.job.executor.port=9999
    
    ### xxl-job, access token
    xxl.job.accessToken=
    
    ### xxl-job log path
    xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
    ### xxl-job log retention days
    xxl.job.executor.logretentiondays=30

    编写配置类:

    package com.xxl.job.executor.core.config;
    
    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * xxl-job config
     */
    @Configuration
    public class XxlJobConfig {
        private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    
        @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
        public XxlJobSpringExecutor xxlJobExecutor() {
            logger.info(">>>>>>>>>>> xxl-job config 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;
        }
    
        /**
         * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
         *
         *      1、引入依赖:
         *          <dependency>
         *             <groupId>org.springframework.cloud</groupId>
         *             <artifactId>spring-cloud-commons</artifactId>
         *             <version>${version}</version>
         *         </dependency>
         *
         *      2、配置文件,或者容器启动变量
         *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
         *
         *      3、获取IP
         *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
         */
    
    
    }

    编写自己的定时任务

    package com.xxl.job.executor.service.jobhandler;
    
    import com.xxl.job.core.biz.model.ReturnT;
    import com.xxl.job.core.handler.IJobHandler;
    import com.xxl.job.core.handler.annotation.XxlJob;
    import com.xxl.job.core.log.XxlJobLogger;
    import com.xxl.job.core.util.ShardingUtil;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.concurrent.TimeUnit;
    
    /**
     * XxlJob开发示例(Bean模式)
     *
     * 开发步骤:
     * 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
     * 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
     * 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
     *
     * @author xuxueli 2019-12-11 21:52:51
     */
    @Component
    public class SampleXxlJob {
        private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
    
    
        /**
         * 1、简单任务示例(Bean模式)
         */
        @XxlJob("demoJobHandler")
        public ReturnT<String> demoJobHandler(String param) throws Exception {
            XxlJobLogger.log("XXL-JOB, Hello World.");
    
            for (int i = 0; i < 5; i++) {
                XxlJobLogger.log("beat at:" + i);
                TimeUnit.SECONDS.sleep(2);
            }
            return ReturnT.SUCCESS;
        }
    
    
        /**
         * 2、分片广播任务
         */
        @XxlJob("shardingJobHandler")
        public ReturnT<String> shardingJobHandler(String param) throws Exception {
    
            // 分片参数
            ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
            XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());
    
            // 业务逻辑
            for (int i = 0; i < shardingVO.getTotal(); i++) {
                if (i == shardingVO.getIndex()) {
                    XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);
                } else {
                    XxlJobLogger.log("第 {} 片, 忽略", i);
                }
            }
    
            return ReturnT.SUCCESS;
        }
    
    
        /**
         * 3、命令行任务
         */
        @XxlJob("commandJobHandler")
        public ReturnT<String> commandJobHandler(String param) throws Exception {
            String command = param;
            int exitValue = -1;
    
            BufferedReader bufferedReader = null;
            try {
                // command process
                Process process = Runtime.getRuntime().exec(command);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());
                bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));
    
                // command log
                String line;
                while ((line = bufferedReader.readLine()) != null){XxlJobLogger.log(line);}// command exit
                process.waitFor();
                exitValue = process.exitValue();}catch(Exception e){XxlJobLogger.log(e);}finally{if(bufferedReader !=null){
                    bufferedReader.close();}}if(exitValue ==0){returnIJobHandler.SUCCESS;}else{returnnewReturnT<String>(IJobHandler.FAIL.getCode(),"command exit value("+exitValue+") is failed");}}/**
         * 4、跨平台Http任务
         */@XxlJob("httpJobHandler")publicReturnT<String> httpJobHandler(String param)throwsException{// requestHttpURLConnection connection =null;BufferedReader bufferedReader =null;try{// connection
                URL realUrl =new URL(param);
                connection =(HttpURLConnection) realUrl.openConnection();// connection setting
                connection.setRequestMethod("GET");
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.setReadTimeout(5*1000);
                connection.setConnectTimeout(3*1000);
                connection.setRequestProperty("connection","Keep-Alive");
                connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
                connection.setRequestProperty("Accept-Charset","application/json;charset=UTF-8");// do connection
                connection.connect();//Map<String, List<String>> map = connection.getHeaderFields();// valid StatusCodeint statusCode = connection.getResponseCode();if(statusCode !=200){thrownewRuntimeException("Http Request StatusCode("+ statusCode +") Invalid.");}// result
                bufferedReader =newBufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));StringBuilder result =newStringBuilder();String line;while((line = bufferedReader.readLine())!=null){
                    result.append(line);}String responseMsg = result.toString();XxlJobLogger.log(responseMsg);returnReturnT.SUCCESS;}catch(Exception e){XxlJobLogger.log(e);returnReturnT.FAIL;}finally{try{if(bufferedReader !=null){
                        bufferedReader.close();}if(connection !=null){
                        connection.disconnect();}}catch(Exception e2){XxlJobLogger.log(e2);}}}/**
         * 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
         */@XxlJob(value="demoJobHandler2", init ="init", destroy ="destroy")publicReturnT<String> demoJobHandler2(String param)throwsException{XxlJobLogger.log("XXL-JOB, Hello World.");returnReturnT.SUCCESS;}publicvoid init(){
            logger.info("init");}publicvoid destroy(){
            logger.info("destory");}}

    运行自己项目 ,配置任务

    项目启动成功后,配置执行器,新建任务:

    1、后台端页面配置执行器:注意:appname和配置保持一致

    2、新建任务,并启动:注意jobHandler需要和注解value值保持一致

    然后启动任务:当出现如下证明启动成功:

    证明jobHandler都注册成功。

    然后再控制台点击启用,dubug查看

    执行后查看控制台:并输出了结果,可以执行自己想要执行的任务了。

  • 相关阅读:
    H5页面富文本展示图片之间存在空隙
    如何关闭eslint语法校验
    K8S service详解
    vim添加或删除多行注释
    K8S 弹性伸缩
    Load高问题排查
    Dockerfile CMD和ENTRYPOINT
    nginx配置
    sed命令
    Pod排错指南
  • 原文地址:https://www.cnblogs.com/sharpest/p/13709802.html
Copyright © 2011-2022 走看看