springboot项目对接xxlJob,动态调用xxlJob接口维护任务
1、引用xxlJob的jar包
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
2、配置xxlJob初始化config
package *********.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
* @Author : JHY
* @Date: 2024-09-12 11:25
*/
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
System.out.println("===========================执行定时任务init==================");
return xxlJobSpringExecutor;
}
}
3、调用xxlJob需要的路径
package ***********.dynamicjob;
/**
* @ClassName : XxlJobServiceUrl
* @Description :
* @Author : JHY
* @Date: 2024-09-19 14:47
*/
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";
public static final String findJobGroup = "/jobinfo/pageList";
}
4、初始化xxlJob相关常用接口:
package **********.dynamicjob;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import ******************.CommonHttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.HttpCookie;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @ClassName : XxlJobServiceApi
* @Description :
* @Author : JHY
* @Date: 2024-09-19 14:47
*/
@Slf4j
@Component
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;
public 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);
log.info("=================xxj-job登录成功了=====================");
return xxlJobCookie;
}
/**
* 查询定时任务执行器
*/
public String findXxlJobGroup() {
Map<String, Object> paramMap = new HashMap<>();
//paramMap.add("appname", appname);
paramMap.put("length", 10);
paramMap.put("start", 0);
paramMap.put("jobGroup", 1);
paramMap.put("triggerStatus", -1);
Map<String, String> headers = new HashMap<>();
String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
headers.put("Cookie", !ObjectUtil.isEmpty(cookieStr) ? cookieStr : loginXxlJob());
System.out.println("URL:"+basicUrl + XxlJobServiceUrl.findJobGroup);
System.out.println("PARAMS:"+JSONObject.toJSONString(paramMap));
return "";
}
/**
* 新增定时任务
* 返回值的content代表主键ID
*/
public String addXxlJob(Map<String,Object> map) {
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("jobGroup",map.get("jobGroup"));
paramMap.put("jobDesc",map.get("jobDesc"));
paramMap.put("author",map.get("author"));
paramMap.put("alarmEmail",map.get("alarmEmail"));
paramMap.put("scheduleType","CRON");
paramMap.put("scheduleConf",map.get("scheduleConf"));
paramMap.put("cronGen_display",map.get("cronGen_display"));
paramMap.put("schedule_conf_CRON","");
paramMap.put("schedule_conf_FIX_RATE","");
paramMap.put("schedule_conf_FIX_DELAY","");
paramMap.put("glueType","BEAN");
paramMap.put("executorHandler",map.get("executorHandler"));
paramMap.put("executorParam",map.get("executorParam"));
paramMap.put("executorRouteStrategy","FIRST");
paramMap.put("childJobId","");
paramMap.put("misfireStrategy","DO_NOTHING");
paramMap.put("executorBlockStrategy","SERIAL_EXECUTION");
paramMap.put("executorTimeout",0);
paramMap.put("executorFailRetryCount",0);
paramMap.put("glueRemark","GLUE代码初始化");
paramMap.put("glueSource","");
Map<String, Object> headers = new HashMap<>();
//String cookieStr = loginCookie.get("XXL_JOB_LOGIN_IDENTITY");
String cookieStr = loginXxlJob();
headers.put("Cookie", cookieStr);
headers.putAll(paramMap);
String s = CommonHttpUtil.sendFormDataPost(basicUrl + XxlJobServiceUrl.addXxlJob, headers);
log.info("=================新增返回:"+s);
return s;
}
/**
* 编辑定时任务
*/
/*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 String startXxlJob(String jobId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", jobId);
Map<String, Object> headers = new HashMap<>();
headers.put("Cookie",loginXxlJob());
headers.putAll(paramMap);
String s = CommonHttpUtil.sendFormDataPost(basicUrl + XxlJobServiceUrl.startXxlJob, headers);
return s;
}
/**
* 删除定时任务
* @param jobId
* @return
*/
public String removeXxlJob(String jobId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", jobId);
Map<String, Object> headers = new HashMap<>();
headers.put("Cookie", loginXxlJob());
headers.putAll(paramMap);
String s = CommonHttpUtil.sendFormDataPost(basicUrl + XxlJobServiceUrl.removeXxlJob, headers);
return s;
}
/**
* 暂停定时任务
*/
public String stopXxlJob(String jobId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", jobId);
Map<String, Object> headers = new HashMap<>();
headers.put("Cookie", loginXxlJob());
headers.putAll(paramMap);
String s = CommonHttpUtil.sendFormDataPost(basicUrl + XxlJobServiceUrl.stopXxlJob, headers);
return s;
}
/**
* 删除定时任务
*//*
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);
}
*/
}
5、发送工具类
package ***********************.common;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.springframework.util.MultiValueMap;
import java.io.IOException;
import java.util.Map;
import static org.apache.kafka.common.utils.Utils.getHost;
/**
* @ClassName : CommonHttpUtil
* @Description :
* @Author : JHY
* @Date: 2024-09-19 15:23
*/
public class CommonHttpUtil {
public static String sendFormDataPost(String url, Map<String,Object> map) {
HttpRequest httpRequest = HttpUtil.createPost(url);
if(null != map){
for(String key:map.keySet()){
httpRequest.form(key,map.get(key).toString());
}
}
HttpResponse httpResponse = httpRequest.execute();
return httpResponse.body();
}
}
6、相关的定时任务
package **************.job;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName :
* @Description :
* @Author : JHY
* @Date: 2024-09-12 11:25
*/
@Slf4j
@Component
@RestController
public class AlarmTask {
@XxlJob("executeAlarmTask")
public void executeAlarmTask(){
log.info("task start");
System.out.println("=========================================定时任务开始执行了==============================");
}
}
7、yml配置
xxl:
job:
accessToken: default_token
userName: admin
password: 000000
jobGroup: 1
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
address: ''
appname: xxl-job-executor-alarm
ip: 127.0.0.1
logpath: /xxxxxx/jobhandler
logretentiondays: 30
port: 0
8、生成定时任务详情

注意:定时任务的executeAlarmTask 需要在新增接口中维护
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)