一、前言
由于SpringBoot自带的定时任务有诸多缺点,例如调度任务的程序是分布式的,需要我们在程序中实现分布式锁,有诸多的弊端,所以选择集成 xxl-job 来实现定时任务!
二、运行xxl-job服务端
2.1 拉取代码
gitee地址:
我们将该代码下载下来,可以看到下面的目录,最关键的是 xxl-job-admin(使用的模块),如果没有相关依赖可以将 xxl-job-core 模块使用maven进行install打包即可(打包完成版本为xxl-job-core-2.4.0-SNAPSHOT.jar),剩下的 xxl-job-executor-samples 则是官方集成的一个简易案例(我们可以进行参考)!
2.2 运行sql文件
我们在数据库中运行位于doc.db中的SQL脚本,就能够在数据库中创建xxl_job的数据库以及相关的表!
运行效果:
2.3 修改配置文件
修改 xxl-job-admin 项目中的 application.properties 配置文件!
可修改端口号,及数据库配置
有需求也可进行邮箱配置
2.4 登录首页
登录地址: http://127.0.0.1:9000/xxl-job-admin/toLogin
用户名: admin
密 码: 123456
三、SpringBoot项目集成
注意: 我们的业务模块具体如何进行集成和使用,可以通过官方案例来进行初步了解!
3.1 新建ape-common-job模块
3.2 引入依赖
<dependencies>
<!-- xxljob相关依赖 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<!-- 不写版本,在maven打包的时候会报错 -->
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
```
<!--Mac的M1芯片导致的启动报错(Windows系统或者Linux系统可能不需要)-->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-resolver-dns-native-macos</artifactId>
<version>4.1.75.Final</version> <!--版本号自己切-->
<classifier>osx-aarch_64</classifier>
</dependency>
<!--仅使用springboot的注解功能 引入该注解-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
注意: 可以使用我们自己install的xxl-job-core包,也可以使用maven引入公网仓库中包含的xxl-job-core包(由于install在本地,会导致在公司中开发其他人缺少该包,所以还是建议使用公网仓库中的)
3.3 编写配置文件
在业务模块ape-user中引入ape-common-job模块
先观察官方案例提供的配置文件内容
我们同样在user模块中配置
xxl:
job:
admin:
addresses: http://localhost:9000/xxl-job-admin #【调度中心部署地址】
accessToken: default_token #【执行器通讯TOKEN】
executor:
appname: ape-frame #【执行器名称】
address: #【执行器地址】 优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址
ip: localhost #【执行器ip】 默认为空表示自动获取IP
port: 9999 #【执行器端口号】 小于等于0则自动获取;默认端口为9999
# 设置xxljob输出的本地日志地址
logpath: C:\Users\86173\Desktop\code\xxl-job
logretentiondays: 30 #【执行器日志文件保存天数】 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
3.4 编写XxlJobConfig类
在ape-common-job模块下新建config.XxlJobConfig类
将官方案例中的core.config.XxlJobConfig复制即可
package com.ssm.job.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
*
* @author xuxueli 2017-04-28
*/
@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;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "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();
*/
}
3.5 执行器配置
第一步: 新增执行器
注意: AppName根据前面配置文件中设置的进行填写!
第二步: 自动注册,进行查看
四、使用xxl-job创建定时任务
4.1 编写定时任务SampleXxlJob类
在业务模块user中创建自己的定时任务!
可将官方案例中提供的service.jobhandle.SampleXxlJob复制下来,只保留简单案例
package com.ssm.user.job;
import com.alibaba.fastjson.JSON;
import com.ssm.user.entity.po.UserPo;
import com.ssm.user.service.UserService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
@Component
public class SampleXxlJob {
private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
@Autowired
private UserService userService;
/**
* 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);
UserPo userPo = userService.queryById(6L);
XxlJobHelper.log("user" + JSON.toJSONString(userPo));
}
// default success
}
}
4.2 新增任务管理
- 调度类型 可选择定时任务执行的规则
- 任务配置 JobHandler为定时任务SampleXxlJob类
@XxlJob里的内容
4.3 运行定时任务
重启服务后,在 任务管理 中操作栏点击操作一次,可通过查询日志快速定位到该任务对应的日志信息。