xxl-job项目搭建

1、源码地址

https://github.com/xuxueli/xxl-job
http://gitee.com/xuxueli0323/xxl-job

2、官方文档地址(源码中也有官方文档):https://www.xuxueli.com/xxl-job/#《分布式任务调度平台XXL-JOB》

3、初始化调度数据库(源码文件中);调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例

/xxl-job/doc/db/tables_xxl_job.sql

4、编译源码,整体编译即可

5、配置部署“调度中心”

调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
/xxl-job/xxl-job-admin/src/main/resources/application.properties
基本配置:配置数据库连接必配;邮箱连接选配;其他配置使用默认即可,后续可根据需要修改配置

6、执行器配置

6.1 使用或复制源码中xxl-job-executor-samples中的xxl-job-executor-sample-springboot项目,
  修改server.port、 xxl.job.admin.addresses、 xxl.job.executor.port即可实现快速搭建

6.2 创建新的springbooot项目
6.2.1 引入依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>版本号与调度器版本号保持一致</version>
</dependency>
6.2.2 在application.properties文件中添加配置信息(将示例项目xxl-job-executor-sample-springboot中的配置复制过来即可)

#项目端口号
server.port=8081
#日志配置
logging.config=classpath:logback.xml
#调度器地址配置
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
#令牌,需和调度器的令牌配置保持一致
xxl.job.accessToken=
#执行器名字
xxl.job.executor.appname=xxl-job-executor-sample
#执行器地址,可不配置
xxl.job.executor.address=
#执行器ip
xxl.job.executor.ip=
#执行器端口号,如果不配置,随机取
xxl.job.executor.port=9999
#日志地址
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
#日志保留时间,如果小于3,认为不会定期清理日志
xxl.job.executor.logretentiondays=30

6.2.3 logback.xml日志配置(非必须,但是如果application.properties中进行了路径配置,此处就需要配置;此处是springboot内置日志打印配置,与xxl-job无关)
<?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>

6.2.4 创建配置类
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

@Value("${xxl.job.admin.addresses}")
private String adminAddresses;

@Value("${xxl.job.accessToken}")
private String accessToken;

@Value("${xxl.job.executor.appname}")
private String appname;

@Value("${xxl.job.executor.address}")
private String address;

@Value("${xxl.job.executor.ip}")
private String ip;

@Value("${xxl.job.executor.port}")
private int port;

@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.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

return xxlJobSpringExecutor;
}
}

6.2.4 创建任务执行类
@Component
public class SampleXxlJob {
private static final Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);


/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");

for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}


/**
* 2、分片广播任务
*/
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {

// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();

XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);

// 业务逻辑
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);
} else {
XxlJobHelper.log("第 {} 片, 忽略", i);
}
}

}
}
原文地址:https://www.cnblogs.com/hanwenbo/p/14321895.html