前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >feign调用XXL-JOB平台

feign调用XXL-JOB平台

原创
作者头像
花落花相惜
修改2021-11-23 13:03:18
1.8K0
修改2021-11-23 13:03:18
举报
文章被收录于专栏:花落的技术专栏
一、应用背景

项目中需要后端以 无入侵

的方式,调用调度中心API服务。然而调度中心设置了登录,调度中心API接口对cookie进行了验证,feign访问调度中心API服务时,需通过其登录验证。

二、实现原理

通过FeignClient客户端声明式调用调度中心Api服务与普通FeignClient相比作了一下几点处理:

  • 调度中心登录Api服务返回值改为feign.Response,原始的http请求响应,方便获取cookie值;
  • 调度中心其他Api服务,新增@RequestHeader("Cookie") String cookie参数,传递cookie值,通过调度中心登录验证;

image.png

三、潜在问题
  1. 网络开销:undefined每次调用接口如果都请求一次登录接口,难免会产生额外的网络开销,可以通过redis缓存cookie值去处理。
  2. 登录失效:undefined由于调度中心cookie有效时间为2小时,需每两小时登录一次,获取新的cookie,可以通过重试机制,实现过期重新登录undefined解决方案: 可以参考 XxlJobComponent.java
四、代码实现
  1. 引入相关jar
代码语言:txt
复制
<dependency>
代码语言:txt
复制
  <groupId>org.springframework.cloud</groupId>
代码语言:txt
复制
  <artifactId>spring-cloud-starter-openfeign</artifactId>
代码语言:txt
复制
</dependency>
代码语言:txt
复制
<dependency>
代码语言:txt
复制
  <groupId>com.xuxueli</groupId>
代码语言:txt
复制
  <artifactId>xxl-job-core</artifactId>
代码语言:txt
复制
  <version>2.3.0</version>
代码语言:txt
复制
</dependency>

2.HttpResultForXxlJob.java

代码语言:txt
复制
import com.alibaba.fastjson.JSON;
代码语言:txt
复制
import lombok.Data;
代码语言:txt
复制
import java.io.Serializable;
代码语言:txt
复制
/**
代码语言:txt
复制
 * xxl-job Api接口响应包装类
 *
 * @author liudong
 * @date 2021/4/25 16:37
 */
@Data
public class HttpResultForXxlJob<T> implements Serializable {
代码语言:txt
复制
    private static final long serialVersionUID = 6512789515344894483L;
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 请求状态码
     */
    private int code;
    /**
     * 消息
     */
    private String msg;
    /**
     * 返回数据信息
     */
    private T content;
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 序列化为Json
     *
     * @return json字符串
     */
    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
代码语言:txt
复制
}
  1. XxlJobClient.java
代码语言:txt
复制
import com.alibaba.fastjson.JSONObject;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.dto.external.xxljob.HttpResultForXxlJob;
代码语言:txt
复制
import feign.Response;
代码语言:txt
复制
import org.springframework.cloud.openfeign.FeignClient;
代码语言:txt
复制
import org.springframework.http.MediaType;
代码语言:txt
复制
import org.springframework.web.bind.annotation.*;
代码语言:txt
复制
import java.util.Map;
代码语言:txt
复制
/**
代码语言:txt
复制
 * xxl-job客户端
 *
 * @author liudong
 * @date 2021/4/25 16:33
 */
@FeignClient(name = "xxlJobClient", url = "${third-party.config.xxl-job.host:not found xxl-job service url}")
public interface XxlJobClient {
    /**
     * xxl-job登录接口
     *
     * @param params 参数
     * @return 响应信息
     */
    @PostMapping(value = "/xxl-job-admin/login", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    Response login(@RequestBody Map<String, ?> params);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 创建定时任务
     *
     * @param cookie cookie
     * @param params 定时任务参数
     * @return 定时任务ID
     */
    @PostMapping(value = "/xxl-job-admin/jobinfo/add", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    HttpResultForXxlJob<Integer> add(@RequestHeader("Cookie") String cookie, @RequestBody Map<String, ?> params);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 更新定时任务
     *
     * @param cookie cookie
     * @param params 定时任务更新参数
     * @return 执行结果
     */
    @PutMapping(value = "/xxl-job-admin/jobinfo/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    HttpResultForXxlJob<String> update(@RequestHeader("Cookie") String cookie, @RequestBody Map<String, ?> params);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 删除定时任务
     *
     * @param cookie cookie
     * @param id     定时任务更新参数
     * @return 执行结果
     */
    @DeleteMapping(value = "/xxl-job-admin/jobinfo/remove")
    HttpResultForXxlJob<String> remove(@RequestHeader("Cookie") String cookie, @RequestParam("id") int id);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 开启任务
     *
     * @param cookie cookie
     * @param id     定时任务ID
     * @return 执行结果
     */
    @PutMapping(value = "/xxl-job-admin/jobinfo/start")
    HttpResultForXxlJob<String> start(@RequestHeader("Cookie") String cookie, @RequestParam("id") int id);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 结束任务
     *
     * @param cookie cookie
     * @param id     定时任务ID
     * @return 执行结果
     */
    @PutMapping(value = "/xxl-job-admin/jobinfo/stop")
    HttpResultForXxlJob<String> stop(@RequestHeader("Cookie") String cookie, @RequestParam("id") int id);
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 结束任务
     *
     * @param cookie cookie
     * @param params 查询参数
     * @return 执行结果
     */
    @GetMapping(value = "/xxl-job-admin/joblog/pageList")
    JSONObject log(@RequestHeader("Cookie") String cookie, @RequestParam("params") Map<String, Object> params);
}
  1. XxlJobComponent.java
代码语言:txt
复制
import cn.hutool.core.bean.BeanUtil;
代码语言:txt
复制
import cn.hutool.core.map.MapUtil;
代码语言:txt
复制
import cn.hutool.http.HttpStatus;
代码语言:txt
复制
import com.alibaba.fastjson.JSON;
代码语言:txt
复制
import com.alibaba.fastjson.JSONObject;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.constant.CacheConstant;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.constant.XxlJobConstant;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.dto.external.xxljob.HttpResultForXxlJob;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.dto.xxljob.XxlJobLogDTO;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.exception.ErrorCode;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.request.xxljob.AddOrUpdateXxlJobInfoRequest;
代码语言:txt
复制
import com.gaodun.pms.cdp.service.acm.ApplicationConfig;
代码语言:txt
复制
import com.gaodun.pms.cdp.service.acm.JobConfig;
代码语言:txt
复制
import com.gaodun.pms.cdp.service.external.feign.XxlJobClient;
代码语言:txt
复制
import com.gaodunwangxiao.pms.exception.AbstractAssert;
代码语言:txt
复制
import com.gaodunwangxiao.pms.exception.ExceptionFactory;
代码语言:txt
复制
import com.gaodunwangxiao.pms.exception.SystemException;
代码语言:txt
复制
import feign.FeignException;
代码语言:txt
复制
import feign.Response;
代码语言:txt
复制
import lombok.extern.slf4j.Slf4j;
代码语言:txt
复制
import org.apache.commons.lang3.ObjectUtils;
代码语言:txt
复制
import org.assertj.core.util.Lists;
代码语言:txt
复制
import org.springframework.beans.factory.annotation.Value;
代码语言:txt
复制
import org.springframework.data.redis.core.RedisTemplate;
代码语言:txt
复制
import org.springframework.retry.annotation.Backoff;
代码语言:txt
复制
import org.springframework.retry.annotation.Recover;
代码语言:txt
复制
import org.springframework.retry.annotation.Retryable;
代码语言:txt
复制
import org.springframework.stereotype.Component;
代码语言:txt
复制
import javax.annotation.Resource;
代码语言:txt
复制
import java.util.HashMap;
代码语言:txt
复制
import java.util.List;
代码语言:txt
复制
import java.util.Map;
代码语言:txt
复制
import java.util.concurrent.TimeUnit;
代码语言:txt
复制
/**
代码语言:txt
复制
 * 任务管理处理器
 *
 * @author liudong
 * @date 2021/4/25 10:56
 */
@Slf4j
@Component
public class XxlJobComponent {
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * xxl job 账号
     */
    @Value("${xxl.job.user-name}")
    private String userName;
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * xxl job 密码
     */
    @Value("${xxl.job.password}")
    private String password;
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * xxl-job客户端
     */
    @Resource
    private XxlJobClient xxlJobClient;
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 应用全局配置
     */
    @Resource
    private ApplicationConfig applicationConfig;
    /**
     * redis操作类
     */
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 登录xxl-job
     */
    public void login() {
        Map<String, Object> userInfo = new HashMap<>(MapUtil.DEFAULT_INITIAL_CAPACITY);
        userInfo.put("userName", userName);
        userInfo.put("password", password);
        // 设置cookie永久有效,对应xxl-job记住密码
        userInfo.put("ifRemember", "on");
        Response response = xxlJobClient.login(userInfo);
        if (HttpStatus.HTTP_OK == response.status()) {
            response.headers().get(XxlJobConstant.COOKIE_KEY).forEach(e -> {
                if (e.contains(XxlJobConstant.XXL_JOB_LOGIN_IDENTITY)) {
                    redisTemplate.opsForValue().set(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY, e, CacheConstant.XXL_JOB_COOKIE_REDIS_TIMEOUT, TimeUnit.HOURS);
                }
            });
        } else {
            throw ExceptionFactory.systemException(ErrorCode.LOGIN_XXL_JOB_FAILURE_EXCEPTION);
        }
    }
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 创建任务
     *
     * @param addOrUpdateXxlJobInfoRequest 任务参数
     * @return 任务ID
     */
 
代码语言:txt
复制
    public Integer add(AddOrUpdateXxlJobInfoRequest addOrUpdateXxlJobInfoRequest) {
代码语言:txt
复制
        if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
代码语言:txt
复制
            login();
代码语言:txt
复制
        }
代码语言:txt
复制
        if (ObjectUtils.isNotEmpty(addOrUpdateXxlJobInfoRequest)) {
代码语言:txt
复制
            HttpResultForXxlJob result = xxlJobClient.add(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), BeanUtil.beanToMap(addOrUpdateXxlJobInfoRequest));
代码语言:txt
复制
            if (HttpStatus.HTTP_OK == result.getCode()) {
代码语言:txt
复制
                log.info(result.getMsg());
代码语言:txt
复制
                return (int) result.getContent();
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return null;
代码语言:txt
复制
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 更新任务
     *
     * @param addOrUpdateXxlJobInfoRequest 任务参数
     */
    public void update(AddOrUpdateXxlJobInfoRequest addOrUpdateXxlJobInfoRequest) {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
            login();
        }
        if (ObjectUtils.isNotEmpty(addOrUpdateXxlJobInfoRequest)) {
            HttpResultForXxlJob result = xxlJobClient.update(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), BeanUtil.beanToMap(addOrUpdateXxlJobInfoRequest));
            log.info(result.getMsg());
            AbstractAssert.isTrue(HttpStatus.HTTP_OK == result.getCode(), ErrorCode.UPDATE_JOB_FAILURE_EXCEPTION);
        }
    }
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 删除任务
     *
     * @param id 任务ID
     */
    public void remove(Integer id) {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
            login();
        }
        if (ObjectUtils.isNotEmpty(id)) {
            HttpResultForXxlJob result = xxlJobClient.remove(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), id);
            log.info(result.getMsg());
            AbstractAssert.isTrue(HttpStatus.HTTP_OK == result.getCode(), ErrorCode.REMOVE_JOB_FAILURE_EXCEPTION);
        }
    }
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 启动任务
     *
     * @param id 任务ID
     */
    public void start(Integer id) {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
            login();
        }
        if (ObjectUtils.isNotEmpty(id)) {
            HttpResultForXxlJob result = xxlJobClient.start(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), id);
            log.info(result.getMsg());
            AbstractAssert.isTrue(HttpStatus.HTTP_OK == result.getCode(), ErrorCode.START_JOB_FAILURE_EXCEPTION);
        }
    }
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 停止任务
     *
     * @param id 任务ID
     */
    public void stop(Integer id) {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
            login();
        }
        if (ObjectUtils.isNotEmpty(id)) {
            HttpResultForXxlJob result = xxlJobClient.stop(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), id);
            log.info(result.getMsg());
            AbstractAssert.isTrue(HttpStatus.HTTP_OK == result.getCode(), ErrorCode.STOP_JOB_FAILURE_EXCEPTION);
        }
    }
 
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 查询日志
     *
     * @param params 查询参数
     * @return 结果集
     */
    @Retryable(value = SystemException.class, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    public List<XxlJobLogDTO> log(Map<String, Object> params) {
        try {
            if (Boolean.FALSE.equals(redisTemplate.hasKey(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY))) {
                login();
            }
            if (ObjectUtils.isEmpty(params)) {
                return Lists.newArrayList();
            }
            JSONObject result = xxlJobClient.log(String.valueOf(redisTemplate.opsForValue().get(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY)), params);
            if (ObjectUtils.isNotEmpty(result) && ObjectUtils.isNotEmpty(result.getString("data"))) {
                return JSON.parseArray(result.getString("data"), XxlJobLogDTO.class);
            }
 
代码语言:txt
复制
        } catch (FeignException e) {
代码语言:txt
复制
            redisTemplate.delete(CacheConstant.XXL_JOB_COOKIE_REDIS_KEY);
代码语言:txt
复制
            throw ExceptionFactory.systemException("远程操作xxl-job失败,进行重试!", e);
代码语言:txt
复制
        }
代码语言:txt
复制
        return Lists.newArrayList();
代码语言:txt
复制
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 重试次数达到最大后回调处理
     *
     * @param systemException 重试异常
     */
    @Recover
    public void recoverCallback(SystemException systemException) {
        log.error("远程操作xxl-job异常!", systemException);
    }
 
代码语言:txt
复制
}
五、测试用例:
代码语言:txt
复制
import cn.hutool.core.bean.BeanUtil;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.dto.xxljob.XxlJobInfoDTO;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.enums.MisfireStrategyEnum;
代码语言:txt
复制
import com.gaodun.pms.cdp.common.request.xxljob.AddOrUpdateXxlJobInfoRequest;
代码语言:txt
复制
import com.gaodun.pms.cdp.web.CdpApplication;
代码语言:txt
复制
import feign.Response;
代码语言:txt
复制
import org.junit.Test;
代码语言:txt
复制
import org.junit.runner.RunWith;
代码语言:txt
复制
import org.springframework.beans.BeanUtils;
代码语言:txt
复制
import org.springframework.boot.test.context.SpringBootTest;
代码语言:txt
复制
import org.springframework.test.context.junit4.SpringRunner;
代码语言:txt
复制
import javax.annotation.Resource;
代码语言:txt
复制
import java.util.HashMap;
代码语言:txt
复制
import java.util.Map;
代码语言:txt
复制
/**
代码语言:txt
复制
 * xxl-job api Test
 *
 * @author liudong
 * @date 2021/4/26 9:45
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CdpApplication.class)
public class XxlJobClientTest {
代码语言:txt
复制
    @Resource
代码语言:txt
复制
    private XxlJobClient xxlJobClient;
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void login() {
代码语言:txt
复制
    }
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void add() {
代码语言:txt
复制
        Map<String, Object> hashMap = new HashMap(2);
代码语言:txt
复制
        hashMap.put("userName", "admin");
代码语言:txt
复制
        hashMap.put("password", "123456");
代码语言:txt
复制
        Response response = xxlJobClient.login(hashMap);
代码语言:txt
复制
        AddOrUpdateXxlJobInfoRequest addOrUpdateXxlJobInfoRequest = new AddOrUpdateXxlJobInfoRequest();
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setJobGroup(2);
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setJobDesc("test");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setAuthor("liudong");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setAlarmEmail("");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setScheduleType("CRON");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setScheduleConf("0/6 * * * * ?");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setGlueType("BEAN");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorHandler("testHandler");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorRouteStrategy("FIRST");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setMisfireStrategy(MisfireStrategyEnum.DO_NOTHING.toString());
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorBlockStrategy("SERIAL_EXECUTION");
代码语言:txt
复制
        XxlJobInfoDTO xxlJobInfoDTO = new XxlJobInfoDTO();
代码语言:txt
复制
        BeanUtils.copyProperties(addOrUpdateXxlJobInfoRequest, xxlJobInfoDTO);
代码语言:txt
复制
        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(addOrUpdateXxlJobInfoRequest);
代码语言:txt
复制
        response.headers().get("set-cookie").forEach(e -> {
代码语言:txt
复制
            if (e.contains("XXL_JOB_LOGIN_IDENTITY")) {
代码语言:txt
复制
                System.out.println(xxlJobClient.add(e, stringObjectMap).toString());
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void update() {
代码语言:txt
复制
        Map<String, Object> hashMap = new HashMap(2);
代码语言:txt
复制
        hashMap.put("userName", "admin");
代码语言:txt
复制
        hashMap.put("password", "123456");
代码语言:txt
复制
        Response response = xxlJobClient.login(hashMap);
代码语言:txt
复制
        AddOrUpdateXxlJobInfoRequest addOrUpdateXxlJobInfoRequest = new AddOrUpdateXxlJobInfoRequest();
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setId(14);
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setJobGroup(2);
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setJobDesc("update");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setAuthor("liudong");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setAlarmEmail("");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setScheduleType("CRON");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setScheduleConf("0/6 * * * * ?");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setGlueType("BEAN");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorHandler("testHandler");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorRouteStrategy("FIRST");
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setMisfireStrategy(MisfireStrategyEnum.DO_NOTHING.toString());
代码语言:txt
复制
        addOrUpdateXxlJobInfoRequest.setExecutorBlockStrategy("SERIAL_EXECUTION");
代码语言:txt
复制
        XxlJobInfoDTO xxlJobInfoDTO = new XxlJobInfoDTO();
代码语言:txt
复制
        BeanUtils.copyProperties(addOrUpdateXxlJobInfoRequest, xxlJobInfoDTO);
代码语言:txt
复制
        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(addOrUpdateXxlJobInfoRequest);
代码语言:txt
复制
        response.headers().get("set-cookie").forEach(e -> {
代码语言:txt
复制
            if (e.contains("XXL_JOB_LOGIN_IDENTITY")) {
代码语言:txt
复制
                System.out.println(xxlJobClient.update(e, stringObjectMap).toString());
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void remove() {
代码语言:txt
复制
        Map<String, Object> hashMap = new HashMap(2);
代码语言:txt
复制
        hashMap.put("userName", "admin");
代码语言:txt
复制
        hashMap.put("password", "123456");
代码语言:txt
复制
        Response response = xxlJobClient.login(hashMap);
代码语言:txt
复制
        response.headers().get("set-cookie").forEach(e -> {
代码语言:txt
复制
            if (e.contains("XXL_JOB_LOGIN_IDENTITY")) {
代码语言:txt
复制
                System.out.println(xxlJobClient.remove(e, 23).toString());
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void start() {
代码语言:txt
复制
        Map<String, Object> hashMap = new HashMap(2);
代码语言:txt
复制
        hashMap.put("userName", "admin");
代码语言:txt
复制
        hashMap.put("password", "123456");
代码语言:txt
复制
        Response response = xxlJobClient.login(hashMap);
代码语言:txt
复制
        response.headers().get("set-cookie").forEach(e -> {
代码语言:txt
复制
            if (e.contains("XXL_JOB_LOGIN_IDENTITY")) {
代码语言:txt
复制
                System.out.println(xxlJobClient.start(e, 22).toString());
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
    @Test
代码语言:txt
复制
    public void stop() {
代码语言:txt
复制
        Map<String, Object> hashMap = new HashMap(2);
代码语言:txt
复制
        hashMap.put("userName", "admin");
代码语言:txt
复制
        hashMap.put("password", "123456");
代码语言:txt
复制
        Response response = xxlJobClient.login(hashMap);
代码语言:txt
复制
        response.headers().get("set-cookie").forEach(e -> {
代码语言:txt
复制
            if (e.contains("XXL_JOB_LOGIN_IDENTITY")) {
代码语言:txt
复制
                System.out.println(xxlJobClient.stop(e, 22).toString());
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、应用背景
  • 二、实现原理
  • 三、潜在问题
  • 四、代码实现
  • 五、测试用例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档