XXL-JOB简介
xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
任务注册和调度流程
任务自动配置
XxlJobConfiguration
/**
* xxl-job自动配置
*/
@Slf4j
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties({XxlJobProperties.class})
@ConditionalOnProperty(name = "xxl.job.config.enabled", havingValue = "true")
public class XxlJobConfiguration {
public XxlJobConfiguration() {
log.info("create XxlJobConfiguration");
}
@Bean
@ConditionalOnClass(XxlJobSpringExecutor.class)
public XxlJobSpringExecutor xxlJobSpringExecutor(XxlJobProperties properties) {
log.info("xxl-job config init. properties={}", properties);
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(properties.getAdminAddresses());
xxlJobSpringExecutor.setAccessToken(properties.getAccessToken());
xxlJobSpringExecutor.setAppname(properties.getAppName());
xxlJobSpringExecutor.setAddress(properties.getAddress());
xxlJobSpringExecutor.setIp(properties.getIp());
xxlJobSpringExecutor.setPort(properties.getPort());
xxlJobSpringExecutor.setLogPath(properties.getLogPath());
xxlJobSpringExecutor.setLogRetentionDays(properties.getLogRetentionDays());
return xxlJobSpringExecutor;
}
}
XxlJobProperties
/**
* xxl-job属性配置
*/
@Slf4j
@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "xxl.job.config")
public class XxlJobProperties {
private boolean enabled = false;
private String adminAddresses;
private String accessToken;
private String appName;
private String address;
private String ip;
private int port;
private String logPath;
private int logRetentionDays;
public XxlJobProperties() {
log.info("create XxlJobProperties");
}
}
任务执行器组件注入和任务处理器注册流程
XxlJobSpringExecutor 注入和 @XxlJob(“jobHandlerName”) 注册流程
XxlJobSpringExecutor#afterSingletonsInstantiated ->
XxlJobSpringExecutor#initJobHandlerMethodRepository ->
XxlJobExecutor#registJobHandler ->
loadJobHandler(name)/registJobHandler(name, MethodJobHandler) ->
jobHandlerRepository
XxlJobExecutor#loadJobHandler(String name)
XxlJobExecutor#registJobHandler(String name, IJobHandler jobHandler)
任务调度流程
通过 HTTP 调度
触发调度:
address:http://192.168.xxx.xxx:9999/
// executor-server (rpc provider)
XxlJobExecutor#embedServer ->
EmbedServer#start(address, port, appname, accessToken) ->
// 分支一:任务处理器调度流程
EmbedServer#executorBiz ->
EmbedHttpServerHandler#channelRead0 ->
// invoke
bizThreadPool.execute -> process(httpMethod, uri, requestData, accessTokenReq) ->
// services mapping
// case "/run":
executorBiz.run(triggerParam) ->
ExecutorBizImpl#run(TriggerParam triggerParam) ->
ExecutorBizImpl() -> XxlJobExecutor.loadJobHandler(triggerParam.getExecutorHandler())
// 分支二:应用地址注册流程
EmbedServer#thread ->
// start http server (netty)
ServerBootstrap() ->
EmbedServer#startRegistry(appname, address) ->
ExecutorRegistryThread.getInstance().start(appname, address)
任务调度流程
EmbedHttpServerHandler#channelRead0 ->
// invoke
bizThreadPool.execute -> EmbedHttpServerHandler#process(httpMethod, uri, requestData, accessTokenReq) ->
// services mapping
// case "/run":
executorBiz.run(triggerParam) ->
ExecutorBizImpl#run(TriggerParam triggerParam)
流量标签的调度隔离
【可行解法】通过 SkyWalking 字节码增强任务处理器名称 name + envTag
。
XxlJobExecutor#loadJobHandler(String name)
XxlJobExecutor#registJobHandler(String name, IJobHandler jobHandler)
SkyWalking 有 apm-xxl-job-2.x-plugin,没有实现我们想要的,可供我们参考。