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

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
在这里插入图片描述
XxlJobExecutor#loadJobHandler(String name)
在这里插入图片描述
XxlJobExecutor#registJobHandler(String name, IJobHandler jobHandler)
在这里插入图片描述

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

The Logic Endpoint
在这里插入图片描述

### XXL-JOB 测试方法和配置教程 #### 使用 TestNG 进行单元测试 为了确保 `XXL-JOB` 的任务执行器能够正常工作,可以利用 `TestNG` 来创建针对特定作业处理器的单元测试案例。这不仅有助于验证业务逻辑是否按预期运作,还能帮助发现潜在的问题。 对于已经定义好的作业处理类如 `DemoGlueJobHandler`,可以通过模拟依赖的服务来进行隔离测试: ```java import static org.mockito.Mockito.*; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class DemoGlueJobHandlerTest { private HelloService mockHelloService; private DemoGlueJobHandler demoGlueJobHandler; @BeforeMethod public void setUp() { // 创建Mock对象并注入到待测类中 mockHelloService = mock(HelloService.class); demoGlueJobHandler = new DemoGlueJobHandler(); demoGlueJobHandler.setHelloService(mockHelloService); } @Test public void testExecute() throws Exception { // 执行被测试的方法 demoGlueJobHandler.execute(); // 验证mocked service的行为 verify(mockHelloService).methodA(); } } ``` 此代码片段展示了如何设置一个简单的单元测试来检验 `execute()` 方法是否会调用 `helloService.methodA()`[^1]。 #### 整合 Apollo 实现动态配置管理 当涉及到更复杂的场景时,比如需要根据不同环境调整参数,则可以引入 `Apollo` 作为外部化配置中心解决方案的一部分。这样的好处是可以让应用程序更加灵活地适应不同的部署条件而无需重新打包发布应用本身。 在集成过程中需要注意的是要正确配置好 `application.properties` 或者其他形式的应用程序属性文件以便于连接至 `Apollo` 客户端库,并且确保所有的敏感数据都得到了妥善保护[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简放视野

深度思考,简放视野。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值