整合 xxl-job 到springboot 项目内

作者: 2010jing | 来源:发表于2019-05-08 00:54 被阅读38次

环境

  • Jdk1.8+
  • Idea
  • Springboot

克隆、运行 xxl-job项目

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

http://gitee.com/xuxueli0323/xxl-job    

具体配置请自行查看官网 分布式任务调度平台XXL-JOB

执行 clean -> install 之后 ,可以得到 xxl-job-admin-2.0.2.jar 文件

xxl-job-admin-jar.png

可以在本地上运行

//windows下 本地运行 命令
java -jar  /some path/xxl-job-admin-2.0.2.jar

可将项目编译打war包部署到tomcat中,

你会看到如下

run-xxl-job-admin-jar.png

页面效果

http://localhost:8080/xxl-job-admin

run-xxl-job-admin-jar-web.png

Springboot项目

  1. 创建项目


    SpringInitializr.png

    初始项目目录结构


    SpringInitializr-1.png
  1. 在pom.xml 文件添加xxl-job-core依赖,完整如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <xxl-job-core.version>2.0.2</xxl-job-core.version>
            <spring-boot.version>2.1.4.RELEASE</spring-boot.version>
    
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <!-- Import dependency management from Spring Boot (依赖管理:继承一些默认的依赖,工程需要依赖的jar包的管理,申明其他dependency的时候就不需要version) -->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-parent</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
    <!--        <dependency>-->
    <!--            <groupId>org.springframework.boot</groupId>-->
    <!--            <artifactId>spring-boot-starter</artifactId>-->
    <!--        </dependency>-->
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- xxl-job-core -->
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
                <version>${xxl-job-core.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.1.6.RELEASE</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
    <!--            <plugin>-->
    <!--                <groupId>org.springframework.boot</groupId>-->
    <!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
    <!--            </plugin>-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
            </plugins>
        </build>
    
    </project>
    
    
  2. 从xxl-job 将相关代码迁移过来

    • XxlJobConfig.java
    package com.example.demo.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.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /**
    * xxl-job config
    *
    * @author xuxueli 2017-04-28
    */
    @Configuration
    @ComponentScan(basePackages = "com.example.demo.jobhandler")
    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(initMethod = "start", destroyMethod = "destroy")
        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;
        }
    
    }
    
    
    • HelloJobHandler.java
    package com.example.demo.jobhandler;
    
    import com.xxl.job.core.biz.model.ReturnT;
    import com.xxl.job.core.handler.IJobHandler;
    import com.xxl.job.core.handler.annotation.JobHandler;
    import com.xxl.job.core.log.XxlJobLogger;
    import org.springframework.stereotype.Component;
    
    
    /**
    * 任务Handler示例(Bean模式)
    *
    * 开发步骤:
    * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
    * 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
    * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
    * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
    *
    * @author xuxueli 2015-12-19 19:43:36
    */
    @JobHandler(value="helloJobHandler")
    @Component
    public class HelloJobHandler extends IJobHandler {
    
        @Override
        public ReturnT<String> execute(String param) throws Exception {
            XxlJobLogger.log("XXL-JOB, Hello World.");
    
            System.out.println("hello " + param);
    
            return SUCCESS;
        }
    
    }
    
    
    • application.properties
    # 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/xxl-job-admin
    ### xxl-job executor address
    xxl.job.executor.appname=xxl-job-executor-sample
    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=-1
    
    
    • logback.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false" scan="true" scanPeriod="1 seconds">
    
        <contextName>logback</contextName>
        <property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
    
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
                </pattern>
            </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="file"/>
        </root>
    
    </configuration>  
    
    

迁移后的项目目录结构

project-structure.png
  1. 运行项目


    run-springboot-project.png

添加任务

  1. 新增任务


    admin-new-task.png

JobHandler 是跟项目开发的对应的jobHandler


admin-new-task-1.png
  1. 执行

执行操作,只会执行一次,

admin-execute-task.png admin-execute-task-1.png

通过日志可以查看

admin-execute-task-result-1.png admin-execute-task-result-2.png

在springboot 项目运行终端也可以看到

admin-execute-task-result-3.png
  1. 启动
admin-run-task.png admin-run-task-1.png

相关文章

网友评论

    本文标题:整合 xxl-job 到springboot 项目内

    本文链接:https://www.haomeiwen.com/subject/gqcpoqtx.html