通过API调用Xxl-Job

背景介绍

公司业务中需要使用到定时任务,前期我们使用的是Quartz,可以满足前期的业务需求(定时任务执行不稳定,能力有限,目前还未查到具体原因,经过测试发现和线程有部分关系),后期随着业务量骤增,服务端需要做集群,这时发现Quartz对集群的支持并不友好,因此我们又找到了Xxl-Job这款定时器以满足搭建集群的目的,Xxl-Job有自己的管理界面,但是我们自己的业务定时任务时由用户自定义搭建的,那么怎样将用户编辑的定时任务同步给Xxl-Job服务呢?这时就需要通过API接口或者其他方式来打通自己的服务和Xxl-Job服务,然而Xxl-Job的文档中并没有提供API,因此就需要我们自己想办法,废话到此,上代码!!!

第一步:登录获取Cookie,因为安全问题,Xxl-Job要求所有业务接口的请求都需要携带Cookie,否则直接访问会跳转回登录界面
@Slf4j
@Component
@RequiredArgsConstructor
public class XxJobLoginInit implements PipelineHandler {

    private final XxlJobServiceApi xxlJobServiceApi;

    @Override
    public void receive(HandlerContext ctx, Fluid<?> t) {
        xxlJobServiceApi.loginXxlJob();
        PipelineHandler.super.receive(ctx, t);
    }

}
第二步:列举我们要用到的API接口

public class XxlJobServiceUrl {

    public static final String loginXxlJob = "/login";

    public static final String addXxlJob = "/jobinfo/add";

    public static final String updateXxlJob = "/jobinfo/update";

    public static final String startXxlJob = "/jobinfo/start";

    public static final String stopXxlJob = "/jobinfo/stop";

    public static final String removeXxlJob = "/jobinfo/remove";

    public static final String findXxlJobPage = "/jobgroup/pageList";

}
第三步:进行业务接口封装,例如增加、删除、查询、启用、禁用定时任务

@Slf4j
@Component
@RequiredArgsConstructor
public class XxlJobServiceApi {

    @Value("${xxl.job.userName}")
    private String userName;
    @Value("${xxl.job.password}")
    private String password;
    @Value("${xxl.job.admin.addresses}")
    private String basicUrl;
    @Value("${xxl.job.executor.appname}")
    private String appname;

    private final Map<String, String> loginCookie = new HashMap<>();

    /**
     * 登录接口
     */
    public String loginXxlJob() {
        HttpResponse response = HttpRequest.post(basicUrl + XxlJobServiceUrl.loginXxlJob).form("userName", userName).form("password", password).execute();
        List<HttpCookie> cookies = response.getCookies();
        Optional<HttpCookie> cookieOpt = cookies.stream().filter(cookie -> cookie.getName().equals("XXL_JOB_LOGIN_IDENTITY")).findFirst();
        if (!cookieOpt.isPresent()) {
            throw new RuntimeException("xxlJob登录失败!");
        }
        String xxlJobCookie = cookieOpt.get().getValue();
        loginCookie.put("XXL_JOB_LOGIN_IDENTITY", xxlJobCookie);
        return xxlJobCookie;
    }


    /**
     * 查询定时任务执行器
     */
    public String findXxlJobGroup() {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("appname", appname);
        paramMap.add("start", "0");
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? cookieStr : loginXxlJob());
        Map map = JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.findJobGroup, paramMap, headers), HashMap.class);
        if (!ObjectUtil.isEmpty(map) && map.containsKey("data") && !ObjectUtil.isEmpty(map.get("data"))) {
            List<Map<String, Object>> mapList = (List<Map<String, Object>>) map.get("data");
            return mapList.get(0).get("id").toString();
        }
        throw new RuntimeException("xxlJob执行器获取失败!");
    }


    /**
     * 新增定时任务
     * 返回值的content代表主键ID
     */
    public Map addXxlJob(String jobDesc, String cron, String jobName, String param) {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("jobDesc", jobDesc);
        paramMap.add("scheduleConf", cron);
        paramMap.add("cronGen_display", cron);
        paramMap.add("schedule_conf_CRON", cron);
        paramMap.add("executorHandler", jobName);
        paramMap.add("executorParam", param);
        paramMap.add("jobGroup", "2");
        paramMap.add("author", "admin");
        paramMap.add("scheduleType", "CRON");
        paramMap.add("glueType", "BEAN");
        paramMap.add("executorRouteStrategy", "FIRST");
        paramMap.add("misfireStrategy", "DO_NOTHING");
        paramMap.add("executorBlockStrategy", "SERIAL_EXECUTION");
        paramMap.add("executorTimeout", "0");
        paramMap.add("executorFailRetryCount", "0");
        paramMap.add("glueRemark", "GLUE代码初始化");
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.addXxlJob, paramMap, headers), HashMap.class);
    }

    /**
     * 编辑定时任务
     */
    public Map updateXxlJob(String jobId, String jobDesc, String cron, String jobName, String param) {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("id", jobId);
        paramMap.add("jobDesc", jobDesc);
        paramMap.add("scheduleConf", cron);
        paramMap.add("cronGen_display", cron);
        paramMap.add("schedule_conf_CRON", cron);
        paramMap.add("executorHandler", jobName);
        paramMap.add("executorParam", param);
        paramMap.add("jobGroup", "2");
        paramMap.add("author", "admin");
        paramMap.add("scheduleType", "CRON");
        paramMap.add("glueType", "BEAN");
        paramMap.add("executorRouteStrategy", "FIRST");
        paramMap.add("misfireStrategy", "DO_NOTHING");
        paramMap.add("executorBlockStrategy", "SERIAL_EXECUTION");
        paramMap.add("executorTimeout", "0");
        paramMap.add("executorFailRetryCount", "0");
        paramMap.add("glueRemark", "GLUE代码初始化");
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.updateXxlJob, paramMap, headers), HashMap.class);
    }

    /**
     * 启动定时任务
     */
    public Map startXxlJob(String jobId) {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("id", jobId);
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.startXxlJob, paramMap, headers), HashMap.class);
    }

    /**
     * 暂停定时任务
     */
    public Map stopXxlJob(String jobId) {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("id", jobId);
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.stopXxlJob, paramMap, headers), HashMap.class);
    }

    /**
     * 删除定时任务
     */
    public Map removeXxlJob(String jobId) {
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("id", jobId);
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.removeXxlJob, paramMap, headers), HashMap.class);
    }

    /**
     * 查询任务列表
     */
    public Map findXxlJobPage() {
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
        headers.add("Cookie", !ObjectUtil.isEmpty(cookieStr) ? "XXL_JOB_LOGIN_IDENTITY=" + cookieStr : "XXL_JOB_LOGIN_IDENTITY=" + loginXxlJob());
        return JSON.parseObject(HttpUtil.post(basicUrl + XxlJobServiceUrl.removeXxlJob, headers), HashMap.class);
    }
第四步:实际业务调用

@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(rollbackOn = Exception.class)
public class PushConfigServiceImpl implements PushConfigService {

    private final XxlJobServiceApi xxlJobServiceApi;
    private final PushConfigRepository pushConfigRepository;

    @Override
    public void deleteById(Long configId) {
        PushConfigDO pushConfigDO= pushConfigRepository.findByConfigId(configId);
        if (!ObjectUtil.isEmpty(pushConfigDO)) {
            pushConfigDO.setDeleted(true);
            pushConfigRepository.save(pushConfigDO);
        }
        Map resultMap = xxlJobServiceApi.removeXxlJob(pushConfigDO.getXxlJobId());
        if (ObjectUtil.isEmpty(resultMap) || !resultMap.containsKey("code") || !resultMap.get("code").equals(200)) {
           throw new BizException("删除推送配置失败,请检查!");
        }
    }

}
xxl-job是一个分布式任务调度框架,而Spring Cloud是一个基于Spring Boot的微服务框架。xxl-job提供了丰富的调度功能,例如定时任务、任务依赖、任务路由等,能够帮助我们实现任务的调度和执行。 要将xxl-job集成到Spring Cloud中,我们首先需要在Spring Cloud项目中引入xxl-job的依赖。可以通过在pom.xml文件中添加相关的依赖来实现。然后,我们需要配置xxl-job的一些参数,例如xxl-job的注册中心地址、执行器的IP地址和端口等。这些配置可以在Spring Cloud的配置文件中进行设置。 在Spring Cloud中集成xxl-job后,我们可以通过调用xxl-job提供的API来创建和管理任务。例如,我们可以通过xxl-jobAPI创建一个定时任务,并设置任务的执行时间和执行频率。我们还可以设置任务的依赖关系,以确保任务按照正确的顺序执行。当任务完成时,xxl-job会提供回调接口,我们可以在回调接口中处理任务的结果。 除了基本的任务调度功能,xxl-job还提供了丰富的监控和管理功能。我们可以通过xxl-job的管理界面来查看任务的执行情况,包括任务的执行日志、执行结果等。同时,xxl-job还提供了报警功能,可以在任务执行出错或超时时发送报警信息。 总结来说,将xxl-job集成到Spring Cloud中,我们可以通过xxl-job提供的API来管理和监控任务的调度和执行。这样可以使我们的Spring Cloud项目具备更强大和灵活的任务调度能力,从而更好地满足我们的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值