XXL-JOB的任务标签环境隔离,怎么做

103 阅读1分钟

原文-知识库,欢迎大家评论互动

XXL-JOB简介

分布式任务调度平台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

image.png

XxlJobExecutor#loadJobHandler(String name) 在这里插入图片描述

XxlJobExecutor#registJobHandler(String name, IJobHandler jobHandler) 在这里插入图片描述

SkyWalking 有 apm-xxl-job-2.x-plugin,没有实现我们想要的,可供我们参考。

The Logic Endpoint

在这里插入图片描述