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 需要在新增接口中维护

Logo

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

更多推荐