xxljob在业务代码中添加任务(登录后token验证)

简介: 之前做过一次在业务代码中调用xxljob的接口添加任务启动任务,xxljob的接口添加免登录验证注解后直接调用,博文地址:xxl-job 在业务代码中添加任务,后面用到的groupId获取方法也在这里面。

之前做过一次在业务代码中调用xxljob的接口添加任务启动任务,xxljob的接口添加免登录验证注解后直接调用,博文地址:xxl-job 在业务代码中添加任务,后面用到的groupId获取方法也在这里面。


这次再这样操作的时候,加了免登录验证注解还是会验证token,第一次拦截器里面确实过了,但不知道为什么还会走第二遍拦截器,这次又会验证token。又试了一下在配置拦截器拦截路径的时候把自己复制出来的接口配置不拦截,但是也没有成功。


所以只能登录之后再携带token调接口了


http请求工具还是使用的forest,官网地址:forest官网


代码如下


package com.gt.gxjhpt.controller;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dtflys.forest.http.ForestCookie;
import com.gt.gxjhpt.entity.bo.XxlJobInfo;
import com.gt.gxjhpt.enumeration.RedisKeyEnum;
import com.gt.gxjhpt.http.XxlJobHttp;
import com.gt.gxjhpt.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
 * @author vhukze
 * @date 2022/3/28 16:24
 */
@RestController
@RequestMapping("demo")
public class DemoController {
    @Resource
    private XxlJobHttp xxlJobHttp;
    @Resource
    private RedisUtil redisUtil;
    @Value("${xxl.job.groupId}")
    private Integer groupId;
    @Value("${xxl.job.userName}")
    private String userName;
    @Value("${xxl.job.password}")
    private String password;
    @GetMapping(value = "addJob", produces = MediaType.APPLICATION_JSON_VALUE)
    public String addJob() {
        XxlJobInfo jobInfo = new XxlJobInfo();
        jobInfo.setJobCron("0 0 0 1 * ? *");
        jobInfo.setGlueType("BEAN");
        jobInfo.setJobGroup(groupId);
        jobInfo.setExecutorHandler("testJob");
        jobInfo.setAuthor("vhukze");
        jobInfo.setJobDesc("描述");
        // 路由策略 第一个
        jobInfo.setExecutorRouteStrategy("FIRST");
        // 阻塞处理策略 单机串行
        jobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");
        // 执行参数
        JSONObject jsonParam = new JSONObject();
        jsonParam.set("redisKey", "vhukze");
        jobInfo.setExecutorParam(jsonParam.toString());
        // 任务超时时间
        jobInfo.setExecutorTimeout(10);
        // 失败重试次数
        jobInfo.setExecutorFailRetryCount(5);
        String result = xxlJobHttp.addJob(jobInfo, (request, cookies) -> {
            // 将之前调用登入接口获得的Cookie传入请求发送到服务端
            cookies.addCookie(this.getXxlToken());
        });
        return JSONUtil.parseObj(result).get("content").toString();
//        xxlJobHttp.startJob(xxlJobAddresses, JSONUtil.parseObj(result).get("content").toString());
    }
    @GetMapping(value = "startJob", produces = MediaType.APPLICATION_JSON_VALUE)
    public String startJob(String id) {
        Map<String, Object> map = new HashMap<>(2, 1);
        map.put("id", id);
        // 执行任务参数
        String runId = IdUtil.objectId();
        JSONObject jsonObject = new JSONObject();
        jsonObject.set("redisKey", runId);
        map.put("executorParam", jsonObject.toString());
        String result = xxlJobHttp.triggerJob(map, (request, cookies) -> {
            // 将之前调用登入接口获得的Cookie传入请求发送到服务端
            cookies.addCookie(this.getXxlToken());
        });
        if (!"200".equals(JSONUtil.parseObj(result).get("code").toString())) {
            return null;
        }
        return runId;
    }
    private ForestCookie getXxlToken() {
        Object token = redisUtil.get(RedisKeyEnum.XXL_TOKEN.getKey());
        if (token != null) {
            return (ForestCookie) token;
        }
        AtomicReference<ForestCookie> cookieAtomic = new AtomicReference<>(null);
        xxlJobHttp.login(new HashMap<String, Object>() {{
            this.put("userName", userName);
            this.put("password", password);
        }}, (request, cookies) -> {
            // 将服务端传来的Cookie放入cookieAtomic
            cookieAtomic.set(cookies.allCookies().get(0));
        });
        redisUtil.set(RedisKeyEnum.XXL_TOKEN.getKey(), cookieAtomic.get());
        return cookieAtomic.get();
    }
}


http请求接口,#{}参数是在配置文件配置的,forest支持读取配置文件

package com.gt.gxjhpt.http;
import com.dtflys.forest.annotation.*;
import com.dtflys.forest.callback.OnLoadCookie;
import com.dtflys.forest.callback.OnSaveCookie;
import com.dtflys.forest.http.ForestCookie;
import com.gt.gxjhpt.entity.bo.XxlJobInfo;
import com.gt.gxjhpt.enumeration.RedisKeyEnum;
import com.gt.gxjhpt.utils.RedisUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
相关文章
|
API
xxl-job restful api
xxl-job restful api
584 0
|
Java fastjson API
Springboot 整合 xxljob 动态API调度任务(进阶篇)
Springboot 整合 xxljob 动态API调度任务(进阶篇)
8737 0
Springboot 整合 xxljob 动态API调度任务(进阶篇)
|
SQL 监控 Java
分布式任务调度之xxl-job
分布式任务调度之xxl-job
|
存储 Java BI
XXL-JOB定时任务知识点和应用实例
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。该处只是介绍xxl_job的一下基础知识和使用的实例,具体的安装调试请参照对应的最新的官方文档,中文开源地址:https://www.xuxueli.com/xxl-job
4974 0
|
6月前
|
Java 调度 数据库
搭建XXL-JOB
XXL-JOB由调度中心和执行器两部分组成。调度中心负责任务调度与管理,支持动态配置、监控告警;执行器部署在微服务中,接收调度请求并执行任务。通过SpringBoot集成xxl-job-core,配置注册地址后可自动注册到调度中心,实现分布式任务调度。
|
SQL 关系型数据库 数据库
PostgreSQL将边界geometry转换为坐标
【8月更文挑战第5天】PostgreSQL将边界geometry转换为坐标
854 10
|
JSON Java API
哇塞!Spring Boot 中的 @DateTimeFormat 和 @JsonFormat,竟能引发数据时间大变革!
【8月更文挑战第29天】在Spring Boot开发中,正确处理日期时间至关重要。
754 1
|
前端开发 Java 关系型数据库
xxl-job 登入功能集成 OIDC 统一认证
xxl-job 是一款 java 开发的、开源的分布式任务调度系统,自带了登录认证功能,不支持对接、扩展 LDAP 、OIDC 等标准认证系统,考虑到单独维护 xxl-job 自有的用户系统不方便,以及存在人员离职、调岗、权限变动等需要及时调整用户权限的情况,需要接入公司统一的 OIDC 认证系统
2476 0
|
SQL Shell 数据库连接
死磕xxl-job(二)
死磕xxl-job(二)
1438 0
|
Arthas Kubernetes 调度
一次线上Xxl-Job定时任务调度失败的排查与解决
在XXL-JOB系统中,每分钟执行一次的任务出现调度异常:首次调度成功,第二次调度失败,但第三次调度显示的是第二次任务的执行时间。问题源于调度中心发送的心跳请求未得到执行器响应,导致连接被Envoy代理关闭。Envoy在等待心跳响应时,后续调度请求被阻塞,直至连接因超时关闭。调度中心收到503响应后也会关闭连接,从而影响第三次调度。解决方案是更新执行器以处理心跳请求或配置Istio Sidecar以绕过Envoy代理特定流量。
4596 1