JAVA进阶之路-定时器xxl-job 搭建
xxl-job定义
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
xxl-job相对于其他调度器的优点
- xxl-job 首先采用分布式任务调度框架,可以进行分布式部署
- xxl-job 简单,界面化对任务进行CRUD操作
- 架构是讲执行器注册到注册中心,也成调度中心,通过调度中心调度任务
- 调度可支持HA
- 执行器可支持分布式, 还可以支持弹性的扩容与缩容
- 具有路由策略,在创建任务的时候需要选择指定的路由策略,路由策略有轮询、随机、一致性HASH、最不经常使用、故障转移、忙碌转移。
通过路由策略选择一个执行器,执行相应的任务 - 故障转移,当执行器出现故障,调度中心会将任务转移到其他执行器上执行
- 阻塞处理, 任务过多,执行器来不及处理,会按照创建任务时指定的策略进行处理,有串行处理,丢弃后续调度,覆盖之前调度
- 任务超时,任务失败重试,任务失败警告
- 分片广播
- 支持事件调度,cron 触发,直接执行
- 支持实时日志, 任务进度查看
- 任务创建支持GLUE, 支持不同语言处理
- 全异步, 任务调度流程全异步化设计实现
上面引用于:https://www.jianshu.com/p/3dc0bdb677ca
推荐篇文章 介绍了三种流行调度器的各自优缺点的文章
xxl-job的缺点
调度中心通过获取DB锁来保证集群中执行任务的唯一性,如果短任务很多,随着调度中心集群数量增加,那么数据库的锁竞争会比较厉害,性能不好。
个人使用感觉
博主本人以前是使用的quartz 感觉最麻烦的就是没有管理页面,有时想调试定时器时,要么是将定时器的事件调短,增加调用次数,要么就是进数据库修改下次调用时间。可以说是非常麻烦。后面换成了xxl-job之后,头也不痛了,脚也不酸了。有了管理页面 也有了让人使用起来十分舒服的页面修改调度器信息,再也不用让妈妈担心了。目前博主只有了一段时间 并没发现有什么不方便的,如果大家有的话欢迎在下方留言分享,说不定有大神也遇到过此问题并解决过哦!
准备工作
1.下载源码
①、GitHub:https://github.com/xuxueli/xxl-job
②、码云:https://gitee.com/xuxueli0323/xxl-job
2.初始刷sql数据,并修改xxl-job-admin项目配置文件里的mysql配置为自己host和账号密码
修改完后就可以直接启动项目 启动后在浏览器输入localhost:8080/xxl-job-admin 即可访问 端口和访问项目名均可在配置文件里进行修改
访问后会出现如下页面
这样就代表以及部署成功了.账号密码默认为 admin 123456 输入后就能进入管理平台了 稍后我们再介绍管理平台的具体用处
开始配置执行器
相对于quartz xxl-job对于的代码侵略性还是算友好的,下面可以开始进行执行器的配置。我们以spring boot作为实例项目。
- 添加xxl-job的依赖
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1-SNAPSHOT</version>
</dependency>
- 在application的配置文件中加入xxl-job的配置
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
# xxl-job管理项目的地址 如果加了就等于说自动将本项目里面的执行器注入到xxl-job的管理平台进行管理,如果没加就是需要手动在管理平台加入此项目的执行器
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample # 执行器的项目名
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999 # netty_http 端口,定时任务通信端口
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler # log日志的保存地址
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30 # log日志保存天数
- 有了配置后就需要使用配置 这时候我们需要把配置文件的熟悉通过config文件注入到spring
/**
* 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.注入后就可以开始写我们的执行器了
@Component
public class SpotKlineXxlJob {
// 该注解的内容就是该执行器的名字
@XxlJob("testJOb")
public ReturnT<String> testJOb(String param) {
//其中 ReturnT<String>形参 和 String param 是配对的 如果加了实参的话就必须有返回形参
//加实参是有些执行器特殊 需要提供参数进行运行。
//如果不加实参 默认返回类型为void即可
return ReturnT.SUCCESS;
}
}
大功告成,这就已经完成xxl-job在项目中的引入了,不需要像quartz一样需要在启动类里面去增加代码调用这些执行器。所以代码侵略性会比较友好。届时我们只需要大概管理平台就能看到我们本项目的执行器和执行任务管理
admin管理平台
进入页面后打开执行器管理菜单,这里我们就能看到我们刚项目中自动注入的执行器,注册方式为自动注册。AppName 这个字段的值就是我们在配置文件中xxl.job.executor.appname 这个字段的值
如果你是使用手动注册的方式的话 届时是什么信息都没有的,需要你新增执行器。填入appName(对应你在项目中配置xxl.job.executor.appname时的信息),名称 给你执行器在管理平台命个名字,注册方式就填你手动录入即可,剩下就是机器地址了,机器地址就填你的项目部署机器的ip加上你项目部署时在配置文件填写的xxl.job.executor.port这个端口的数据
例如 http://10.0.0.33:9999
http://这前缀是必须要输入的
查看完执行器接下来查看我们所配置的定时器任务信息,打开任务管理就能看到我们写的任务。我们可以点击操作里的编辑对定时器任务进行修改
设置负责人和cron表达式 执行器就是选择我们自动注入的执行器 这个执行器名字也是自动注入后默认的名字 如果想要修改也可以在执行器管理菜单中进行修改,如果是手动注册的话新增后选择你自己创建的执行器 剩下的负责人 任务描述还有cron表达式 这几个按自己业务填写,剩下的必填项基本默认就行
修改完后可以启动任务,任务就会根据cron表达式去执行。也可以点击操作里的执行一次打到立即生效定时器任务得效果,这个功能还是很方便测试和调试代码的。
执行后我们可以在调度日志或者操作里面的查询日志查看我们的任务执行结果
点击查看调度备注就能看到失败日志或者成功日志。
总结
以上就是xxl-job的搭建以及正常的使用方法。相比qurtz的话会比较方便,有了管理页面,也没有quartz那么繁重。