xxjob怎么启动_分布式定时任务xxJob的常用姿势都集齐了,SoEasy!

xxjob怎么启动_分布式定时任务xxJob的常⽤姿势都集齐
后花园景观设计
了,SoEasy!
前⾔
任务调度是java项⽬中常⽤的⼀种组件,可以指定任务在何时进⾏触发,最熟悉的是spring框架⾥⾯的quartz,较流⾏的有⼀些分布式调度组件,⽐如elastic-job/azkaban,都是基于quartz⼆次开发的,今天介绍⼀款分布式的任务调度器xxl-job。
项⽬介绍
xxl-job是⼀款极容易学习上⼿的轻量级开源分布式调度框架,分为管理端和执⾏端两块,管理端负责配置任务信息以及查看任务执⾏⽇志,执⾏端只需要配置与管理端的连接信息就可以进⾏具体的任务逻辑开发了,⽬前版本还在持续迭代中,使⽤简单,功能强⼤,具体功能特性可以看下官⽅介绍。废话不多说,直接进⼊实战把。
实战
1.服务端部署
创建⼀个新的spring boot项⽬,将下载的xxl-job-admin⽬录下的⽂件以及l⽂件都拷贝到新建的项⽬中(如果不想新建项⽬可以直接⽤下载下来的项⽬进⾏修改部署),修改application.properties中的数据库连接信息。
image-20200603145447639
⼩编是⾃⼰创建的新项⽬,需要⼿动改了l依赖xxl-job-core的版本为2.2.0
image-20200603150900339
修改l中的⽇志输出路径。
这交互,可以啊,是不是很带感。tolo
2.执⾏端配置
创建⼀个新的module,跟服务端⼀样,也需要修改下l以及在l添加xxl-job-core的依赖。
为了模拟分布式效果,⼩编创建了2个配置⽂件来区分2个执⾏服务。
application-9998.properties
# web port
server.port=8081
# no web
#spring.main.web-environment=false
# log config
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
utor.appname=my-job-executor
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
utor.address=
### xxl-job executor server-info
utor.ip=
utor.port=9998
### xxl-job executor log-path
utor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
米尔斯海默
utor.logretentiondays=30
application-9999.properties
# web port
server.port=8082
# no web
#spring.main.web-environment=false
# log config
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
utor.appname=my-job-executor
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
utor.address=
### xxl-job executor server-info
utor.ip=
utor.port=9999
### xxl-job executor log-path
utor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
utor.logretentiondays=30
细⼼的童鞋会发现只有server.port和utor.port不同,执⾏器服务跟spring boot⼀样,⾃带内嵌tomcat,也会暴露⼀个端⼝注册到服务端,进⾏⾼可⽤负载。
创建⼀个java config类,定义⼀个使⽤配置的XxlJobSpringExecutor执⾏类,如下
@Configuration
public class XxlJobConfig {
private Logger logger = Logger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${utor.appname}")
private String appname;
@Value("${utor.address}")
private String address;
@Value("${utor.ip}")
private String ip;
@Value("${utor.port}")
private int port;
@Value("${utor.logpath}")
private String logPath;
@Value("${utor.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;
sram
}
配置2个启动配置,分别启动,效果如下:
完美启动2个服务,看下服务端平台是不是有这两台执⾏服务的注册信息。注意:为了演⽰,事先创建了⼀个执⾏器,AppName⼀定要与配置⽂件中utor.appname⼀致。
3.任务开发
3.1 基于⽅法注解任务
话不多说,直接上代码把,毕竟代码是程序员最好的交流⽅式。
/**
* 1、注解任务
*/
@XxlJob(value = "myJobAnnotationHandler",init = "init", destroy = "destroy") public ReturnT myJobAnnotationHandler(String param) throws Exception { XxlJobLogger.log("XXL-JOB-ANNOTATION, myJobAnnotationHandler."); log.info("my first annotation job run, param: {},port:{}",param,port);
return ReturnT.SUCCESS;
}
public void init(){
log.info("my annotation job init");
}
public void destroy(){
log.info("my job annotation job destory");
}
3.2 基于api任务
@Slf4j
public class ApiJob extends IJobHandler {
@Override
脐点1988public ReturnT execute(String param) throws Exception {
XxlJobLogger.log("XXL-JOB-API, Hello World.");
log.info("my job api run, param: {}",param);
return ReturnT.SUCCESS;
}
}
@PostConstruct
public void registerHandler(){
}
3.3 分⽚⼴播任务
/**
* 2、分⽚任务
*/
@XxlJob("myShardJobAnnotationHandler")
public ReturnT myShardJobAnnotationHandler(String param) throws Exception {
XxlJobLogger.log("XXL-JOB-ANNOTATION, myShardJobAnnotationHandler.");
log.info("my shard job run, param: {}",param);
ShardingUtil.ShardingVO shardingVO = ShardingVo();
log.info("分⽚参数:当前分⽚序号 = {}, 总分⽚数 = {}", Index(), Total());
// 业务逻辑
for (int i = 0; i < Total(); i++) {
if (i == Index()) {
log.info("第 {} ⽚, 命中分⽚开始处理", i);avmen
} else {
log.info("第 {} ⽚, 忽略", i);
}
}
return ReturnT.SUCCESS;
}
上⾯是整理的⽐较实⽤的任务创建⽅式,个⼈偏好于注解形式,⽅法上加⼀个注解就完事了。
4.任务执⾏
剩下的就是傻⽩甜的界⾯操作了,⾛起。
4.1 单任务执⾏
创建⼀个路由策略为轮询的任务,指定corn表达式,并填⼊JobHandler为myJobAnnotationHandler,myJobAnnotationHandler其实就是
spring IOC容器中管理bean的名称,有兴趣的童鞋可以看下源码。
为了演⽰效果,点击执⾏⼀次并进⾏任务参数输⼊。
轮询调⽤执⾏器服务效果如下:
4.2 ⼦任务执⾏
更新任务,并指定⼦任务id为5,多个⼦任务的需要以逗号隔开
执⾏任务结果如下
4.3 分⽚⼴播任务执⾏
分⽚任务其实就是⼴播功能,每次触发,每个执⾏服务的业务执⾏类都会被调⽤,类似于kafka⾥⾯的不同消费组都要对同⼀个topic进⾏消费⼀
样。
执⾏后的效果如下
太强势了,需要定时刷新项⽬中的配置信息,⽤这个⽅式很完美。
5.任务⽇志
任务⽇志其实是很重要的⼀块,⽅便回溯任务历史执⾏情况, 以便跟踪问题并矫正丢失的业务数据

本文发布于:2024-09-22 18:28:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/284527.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   配置   管理   信息   需要   启动   分布式   效果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议