XXL-JOB学习笔记-基于代码实现新建、修改任务

项目需要在当前的xxl-job环境上,基于代码实现任务的新建、修改等功能。查看部分资料发现可以通过xxl-job的http接口服务实现。
下面是实现细节的相关记录:
  • 项目部分依赖包版本如下:
<!-- SpringBoot依赖包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

<!-- Feign依赖包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- XXL-JOB依赖包 -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.1</version>
</dependency>
  • 根据xxl-job的登录接口获取cookie信息,用于后续其他接口的正常访问。
@Slf4j
@Service("xxlJobAdminLoginService")
public class XxlJobAdminLoginServiceImpl implements XxlJobAdminLoginService {

    private static final String LOGIN_PATH = "login";

    @Value("${xxl.job.admin.addresses:}")
    private String adminAddresses;

    @Value("${xxl.job.admin.username:}")
    private String username;

    @Value("${xxl.job.admin.password:}")
    private String password;

    private final Cache<String, String> cache = new MemoryCache();

    @Override
    public String readLoginCookie() throws BusinessException {
        String cookie = cache.get(LOGIN_PATH);
        return StrUtil.isBlank(cookie) ? readCookieFromLogin() : cookie;
    }

    private String readCookieFromLogin() {
        Map<String, String> params = new HashMap<>(2);
        params.put("userName", username);
        params.put("password", password);
        Map<String, Object> respAndHeaders = HttpClientUtils.sendPostThenRespAndHeaders(
            adminAddresses + LOGIN_PATH, params, "UTF-8");
        log.info("response {}", respAndHeaders);
        Map<String, String> headers = (Map<String, String>) respAndHeaders.get("headers");
        String setCookie = headers.get("Set-Cookie");
        log.info("set cookie {}", setCookie);
        cache.put(LOGIN_PATH, setCookie, System.currentTimeMillis() + 3600000);
        return setCookie;
    }

}
  • 基于feign访问xxl-job的http接口服务,主要是JobGroup和JobInfo两个功能相关的接口服务。
@FeignClient(name = "xxl-job-admin", qualifiers = "xxlJobAdminJobGroupService", url = "${xxl.job.admin.addresses}",
    configuration = XxlJobAdminFeignConfiguration.class, fallbackFactory = XxlJobAdminJobGroupServiceFallbackFactory.class)
public interface XxlJobAdminJobGroupService {

    /**
     * save
     * @param jobGroupParams
     * @return
     */
    @PostMapping(value = "jobgroup/save", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> save(@RequestBody JobGroupParams jobGroupParams);

    /**
     * update
     * @param jobGroupParams
     * @return
     */
    @PostMapping(value = "jobgroup/update", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> update(@RequestBody JobGroupParams jobGroupParams);

    /**
     * read pagination
     * @param jobGroupPageParams
     * @return
     */
    @PostMapping(value = "jobgroup/pageList", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminPageResult<JobGroup> readPagination(@RequestBody JobGroupPageParams jobGroupPageParams);

}

@Slf4j
@Component("xxlJobAdminJobGroupServiceFallbackFactory")
class XxlJobAdminJobGroupServiceFallbackFactory implements FallbackFactory<XxlJobAdminJobGroupService> {

    @Override
    public XxlJobAdminJobGroupService create(Throwable throwable) {
        log.error(throwable.getMessage(), throwable);
        return new XxlJobAdminJobGroupService() {

            @Override
            public XxlJobAdminResult<String> save(JobGroupParams jobGroupParams) {
                return null;
            }

            @Override
            public XxlJobAdminResult<String> update(JobGroupParams jobGroupParams) {
                return null;
            }

            @Override
            public XxlJobAdminPageResult<JobGroup> readPagination(JobGroupPageParams jobGroupPageParams) {
                return null;
            }

        };
    }

}
@FeignClient(name = "xxl-job-admin", qualifiers = "xxlJobAdminJobInfoService", url = "${xxl.job.admin.addresses}",
    configuration = XxlJobAdminFeignConfiguration.class, fallbackFactory = XxlJobAdminJobInfoServiceFallbackFactory.class)
public interface XxlJobAdminJobInfoService {

    /**
     * save
     * @param jobInfoParams
     * @return
     */
    @PostMapping(value = "jobinfo/add", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> save(@RequestBody JobInfoParams jobInfoParams);

    /**
     * update
     * @param jobInfoParams
     * @return
     */
    @PostMapping(value = "jobinfo/update", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> update(@RequestBody JobInfoParams jobInfoParams);

    /**
     * start
     * @param id
     * @return
     */
    @PostMapping(value = "jobinfo/start", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> start(@RequestParam("id") Integer id);

    /**
     * stop
     * @param id
     * @return
     */
    @PostMapping(value = "jobinfo/stop", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminResult<String> stop(@RequestParam("id") Integer id);

    /**
     * read pagination
     * @param jobInfoPageParams
     * @return
     */
    @PostMapping(value = "jobinfo/pageList", consumes = {"application/x-www-form-urlencoded"})
    public XxlJobAdminPageResult<JobInfo> readPagination(@RequestBody JobInfoPageParams jobInfoPageParams);

}

@Slf4j
@Component("xxlJobAdminJobInfoServiceFallbackFactory")
class XxlJobAdminJobInfoServiceFallbackFactory implements FallbackFactory<XxlJobAdminJobInfoService> {

    @Override
    public XxlJobAdminJobInfoService create(Throwable throwable) {
        log.error(throwable.getMessage(), throwable);
        return new XxlJobAdminJobInfoService() {

            @Override
            public XxlJobAdminResult<String> save(JobInfoParams jobInfoParams) {
                return null;
            }

            @Override
            public XxlJobAdminResult<String> update(JobInfoParams jobInfoParams) {
                return null;
            }

            @Override
            public XxlJobAdminResult<String> start(Integer id) {
                return null;
            }

            @Override
            public XxlJobAdminResult<String> stop(Integer id) {
                return null;
            }

            @Override
            public XxlJobAdminPageResult<JobInfo> readPagination(JobInfoPageParams jobInfoPageParams) {
                return null;
            }

        };
    }

}
  • 使用RequestInterceptor统一为所有Feign请求的Header添加Cookie信息。
@RequiredArgsConstructor
public class FeignRequestInterceptor implements RequestInterceptor {

    private static final String HEADER_COOKIE = "Cookie";

    private final XxlJobAdminLoginService xxlJobAdminLoginService;

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header(HEADER_COOKIE, xxlJobAdminLoginService.readLoginCookie());
    }

}
public class XxlJobAdminFeignConfiguration {

    @Bean
    public Retryer xxlJobAdminFeignRetryer() {
        return new Retryer.Default(100, SECONDS.toMillis(1), 1);
    }

    @Bean
    public RequestInterceptor xxlJobAdminFeignRequestInterceptor(XxlJobAdminLoginService xxlJobAdminLoginService) {
        return new FeignRequestInterceptor(xxlJobAdminLoginService);
    }

}
  • 附带一份xxl-job的配置属性
xxl:
  job:
    enable: true
    admin:
      # 调度中心部署跟地址
      addresses: http://192.168.1.1:28080/xxl-job-admin/
      username: admin
      password: 123456
    executor:
      # 执行器AppName
      app-name: xxxxxx-platform
      # 执行器名称
      name: XXXXXX平台
      # 服务注册地址,优先使用该配置作为注册地址 为空时使用内嵌服务 ”IP:PORT“ 作为注册地址 从而更灵活的支持容器类型执行器动态IP和动态映射端口问题
      address:
      # 执行器IP[选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP ,该IP不会绑定Host仅作为通讯实用;地址信息用于执行器注册和调度中心请求并触发任务
      ip:
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9099
      port: 9099
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径
      log-path: handler_log
      # 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效
      log-retention-days: -1
      # 执行器通讯TOKEN
      access-token: xxxxxxxx
      # 执行器地址类型:0=自动注册、1=手动录入,默认为0
      address-type: 0
      # 执行器地址列表:在执行器地址类型为1的情况下,手动录入执行器地址列表,多地址逗号分隔
      address-list: http://192.168.1.1:9099

自此,便可以基于代码的方式新建、修改任务。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值