魔改xxl-job,彻底告别手动配置任务!( 二 )

Headers中添加了一条名为XXL_JOB_LOGIN_IDENTITYcookie

魔改xxl-job,彻底告别手动配置任务!

文章插图
至于这条cookie,则是在通过用户名和密码调用调度中心的/login接口时返回的,在返回的response可以直接拿到 。只要保存下来,并在之后每次请求时携带,就能够正常访问其他接口了 。
到这里,我们需要的5个接口就基本准备齐了,接下来准备开始正式的改造工作 。
改造我们改造的目的是实现一个starter,以后只要引入这个starter就能实现executorjobHandler的自动注册,要引入的关键依赖有下面两个:
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>1、接口调用在调用调度中心的接口前,先把xxl-job-admin模块中的XxlJobInfoXxlJobGroup这两个类拿到我们的starter项目中,用于接收接口调用的结果 。
登录接口创建一个JobLoginService,在调用业务接口前,需要通过登录接口获取cookie,并在获取到cookie后,缓存到本地的Map中 。
private final Map<String,String> loginCookie=new HashMap<>();public void login() {String url=adminAddresses+"/login";HttpResponse response = HttpRequest.post(url).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("get xxl-job cookie error!");String value = https://www.huyubaike.com/biancheng/cookieOpt.get().getValue();loginCookie.put("XXL_JOB_LOGIN_IDENTITY",value);}其他接口在调用时,直接从缓存中获取cookie,如果缓存中不存在则调用/login接口,为了避免这一过程失败,允许最多重试3次 。
public String getCookie() {for (int i = 0; i < 3; i++) {String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");if (cookieStr !=null) {return "XXL_JOB_LOGIN_IDENTITY="+cookieStr;}login();}throw new RuntimeException("get xxl-job cookie error!");}执行器接口创建一个JobGroupService,根据appName和执行器名称title查询执行器列表:
public List<XxlJobGroup> getJobGroup() {String url=adminAddresses+"/jobgroup/pageList";HttpResponse response = HttpRequest.post(url).form("appname", appName).form("title", title).cookie(jobLoginService.getCookie()).execute();String body = response.body();JSONArray array = JSONUtil.parse(body).getByPath("data", JSONArray.class);List<XxlJobGroup> list = array.stream().map(o -> JSONUtil.toBean((JSONObject) o, XxlJobGroup.class)).collect(Collectors.toList());return list;}【魔改xxl-job,彻底告别手动配置任务!】我们在后面要根据配置文件中的appNametitle判断当前执行器是否已经被注册到调度中心过,如果已经注册过那么则跳过,而/jobgroup/pageList接口是一个模糊查询接口,所以在查询列表的结果列表中,还需要再进行一次精确匹配 。
public boolean preciselyCheck() {List<XxlJobGroup> jobGroup = getJobGroup();Optional<XxlJobGroup> has = jobGroup.stream().filter(xxlJobGroup -> xxlJobGroup.getAppname().equals(appName)&& xxlJobGroup.getTitle().equals(title)).findAny();return has.isPresent();}

经验总结扩展阅读