三方通过接口创建xxl-job任务调度(支持GLUE)

依赖

        <!--xxljob-->
        <!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.1</version>
        </dependency>
        <!--org.apache.commons.httpclient-->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

1、XxlJobClient-模拟登录

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xxljob.config.XxlJobClientConfigProperties;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @Author ygq
 * @Date 2024年4月24日
 */
@Component
public class XxlJobClient {
    private String COOKIE = "";
    private HttpClient httpClient;
    private static final String POST_FORM_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";
    private static final Header POST_FORM_CONTENT_TYPE_HEADER = new Header("Content-Type", POST_FORM_CONTENT_TYPE);
    @Autowired
    private XxlJobClientConfigProperties clientConfigProperties;

    private final Logger log = LoggerFactory.getLogger(getClass());


    @PostConstruct
    public void init() throws IOException {
        log.debug("xxl JOB 初始化配置:{}", clientConfigProperties.toString());
        httpClient = new HttpClient();
        login();
    }

    /**
     * 登录获取 cookie
     *
     * @throws IOException
     */
    private void login() throws IOException {
        HttpMethod postMethod = new PostMethod(clientConfigProperties.getLoginUrl());
        httpClient.executeMethod(postMethod);
        if (postMethod.getStatusCode() == 200) {
            Cookie[] cookies = httpClient.getState().getCookies();
            StringBuilder tmpCookies = new StringBuilder();
            for (Cookie c : cookies) {
                tmpCookies.append(c.toString()).append(";");
            }
            COOKIE = tmpCookies.toString();
            log.debug("xxlJob 登录成功");
        } else {
            log.debug("xxlJob 登录失败:{}", postMethod.getStatusCode());
        }
    }

    /**
     * 创建任务
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject createJob(JSONObject params) throws IOException {
        return doPost(clientConfigProperties.getJobInfoAddUrl(), params);
    }

    /**
     * 更新任务
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject updateJob(JSONObject params) throws IOException {
        return doPost(clientConfigProperties.getJobInfoUpdateUrl(), params);
    }

    /**
     * 根据任务 ID 加载
     *
     * @param id
     * @return
     * @throws IOException
     */
    public JSONObject loadById(int id) throws IOException {
        log.info("loadById: {}", id);
        return doGet(String.format(clientConfigProperties.getJobInfoLoadByIdUrl(), id));
    }

    /**
     * 删除任务
     *
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject deleteJob(int id) throws IOException {
        log.info("deleteJob: {}", id);
        return doGet(String.format(clientConfigProperties.getJobInfoDeleteUrl(), id));
    }

    /**
     * 开启任务
     *
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject startJob(int id) throws IOException {
        log.info("startJob: {}", id);
        return doGet(String.format(clientConfigProperties.getJobInfoStartJobUrl(), id));
    }

    /**
     * 执行一次
     *
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject startJobOnce(JSONObject params) throws IOException {
        return doGet(String.format(clientConfigProperties.getJhobInfoTriggerUrl(), params));
    }


    /**
     * 停止任务
     *
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject stopJob(int id) throws IOException {
        log.info("stopJob: {}", id);
        return doGet(String.format(clientConfigProperties.getJobInfoStopJobUrl(), id));
    }


    /**
     * 创建执行器
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject createJobGroup(JSONObject params) throws IOException {
        return doPost(clientConfigProperties.getJobGroupSaveUrl(), params);
    }

    /**
     * 删除执行器
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject removeJobGroup(JSONObject params) throws IOException {
        return doPost(clientConfigProperties.getJobGroupRemoveUrl(), params);
    }

    /**
     * 执行器列表
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject jobGroupPageList(JSONObject params) throws IOException {
        params.put("start", Optional.ofNullable(params.getInteger("start")).orElse(0));
        params.put("length", Optional.ofNullable(params.getInteger("length")).orElse(10));
        return doPost(clientConfigProperties.getJobGroupPageListUrl(), params);
    }

    /**
     * 根据appname获取执行器Id
     *
     * @param appName
     * @return
     * @throws IOException
     */
    public JSONObject getJobGroupByAppName(String appName) throws IOException {
        return doPost(clientConfigProperties.getJobGroupGetByAppNameUrl()+"?appName="+appName, new JSONObject());
    }

    /**
     * 任务列表
     *
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject jobInfoPageList(JSONObject params) throws IOException {
        params.put("start", Optional.ofNullable(params.getInteger("start")).orElse(0));
        params.put("length", Optional.ofNullable(params.getInteger("length")).orElse(10));
        return doPost(clientConfigProperties.getJobInfoPageListUrl(), params);
    }

    /**
     * 发起 GET 请求
     *
     * @param url
     * @return
     * @throws IOException
     */
    private JSONObject doGet(String url) throws IOException {
        GetMethod get = new GetMethod(url);
        get.setRequestHeader("cookie", COOKIE);
        httpClient.executeMethod(get);
        return readResponse(get);
    }

    /**
     * post 请求
     *
     * @param url
     * @param params
     * @return
     * @throws IOException
     */
    private JSONObject doPost(String url, JSONObject params) throws IOException {
        PostMethod post = new PostMethod(url);
        post.setRequestHeader("cookie", COOKIE);
        List<NameValuePair> pairList = new ArrayList<>();
        params.forEach((k, v) -> pairList.add(new NameValuePair(k, v.toString())));
        NameValuePair[] arr = pairList.toArray(new NameValuePair[0]);
        post.setRequestBody(arr);
        post.setRequestHeader(POST_FORM_CONTENT_TYPE_HEADER);
        httpClient.executeMethod(post);
        return readResponse(post);
    }

    /**
     * 处理响应内容
     *
     * @param httpMethod
     * @return
     * @throws IOException
     */
    private JSONObject readResponse(HttpMethod httpMethod) {
        if (httpMethod.getStatusCode() == HttpStatus.SC_OK) {
            try (InputStream inputStream = httpMethod.getResponseBodyAsStream();
                 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                 BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                return JSON.parseObject(bufferedReader.lines().collect(Collectors.joining(System.lineSeparator())));
            } catch (IOException e) {
                log.error("读取响应失败:{}", e.getMessage(), e);
                JSONObject error = new JSONObject();
                error.put("code", HttpStatus.SC_INTERNAL_SERVER_ERROR);
                error.put("msg", "响应内容读取失败:" + e.getMessage());
                return error;
            }
        }
        return new JSONObject();
    }
}

2、configproperties-配置基础接口地址

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/**
 * @Author ygq
 * @Date 2024年4月24日
 */
@Configuration
@Data
public class XxlJobClientConfigProperties {

    @Value("${xxl.job.admin.addresses}/login?userName=admin&password=123456")
    private String loginUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/add")
    private String jobInfoAddUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/remove?id=%s")
    private String jobInfoDeleteUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/start?id=%s")
    private String jobInfoStartJobUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/stop?id=%s")
    private String jobInfoStopJobUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/update")
    private String jobInfoUpdateUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/loadById/%s")
    private String jobInfoLoadByIdUrl;
    @Value("${xxl.job.admin.addresses}/jobinfo/trigger")
    private String jhobInfoTriggerUrl;
    /**
     * 任务列表
     */
    @Value("${xxl.job.admin.addresses}/jobinfo/pageList")
    private String jobInfoPageListUrl;
    /**
     * 执行器列表
     */
    @Value("${xxl.job.admin.addresses}/jobgroup/pageList")
    private String jobGroupPageListUrl;
    /**
     * 执行器创建 URL
     */
    @Value("${xxl.job.admin.addresses}/jobgroup/save")
    private String jobGroupSaveUrl;
    /**
     * 执行器删除 URL
     */
    @Value("${xxl.job.admin.addresses}/jobgroup/remove")
    private String jobGroupRemoveUrl;

    @Value("${xxl.job.admin.addresses}/jobgroup/getJobGroupByAppName")
    private String jobGroupGetByAppNameUrl;



}

3、xxljobconfig-配置xxljob平台基础信息

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;

import java.io.File;

/**
 * xxl-job config
 *
 */
@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;

    @Value("${file.sub.excel.path}")
    private     String subFilePath;
    @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);

        return xxlJobSpringExecutor;
    }



}

4、service-具体实现业务

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.tomcat.jni.FileInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;

@Slf4j
@Service
public class XxljobService {


    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Autowired
    private XxlJobClient xxlJobClient;

    @Autowired
    RestTemplate restTemplate;

    /**
     * 封装glueSource脚本
     *
     * @param xxlJobInfoVO
     * @return
     */
    @Override
    public String getGlueSourceStr(XxlJobInfoVO xxlJobInfoVO) {
      return "";
    }


    /**
     * 分页查询执行器列表
     *
     * @param page       当前页码
     * @param rows       每页数量
     * @param direction  排序规则
     * @param properties 排序规则
     * @param appname
     * @param title
     * @return
     */
    @Override
    public JsonResponse getJobGroupPageList(int page, int rows, String direction, String properties, String title) {
        Pageable pageable = getPageable(page, rows, direction, properties);
        Map<String, Object> param = new HashMap<>();
        page -= 1;
        param.put("start", page < 0 ? "0" : page);
        param.put("length", rows);
        param.put("appname", appname);
        if (StringUtils.isNotBlank(title)) {
            param.put("title", title);
        }
        JSONObject paramObject = new JSONObject(param);
        try {
            JSONObject jobGroupMsg = xxlJobClient.jobGroupPageList(paramObject);
            Object data = jobGroupMsg.get("data");
            if (data != null) {
                List<Object> list = new ArrayList<Object>();
                if (data instanceof ArrayList<?>) {
                    for (Object o : (List<?>) data) {
                        list.add(o);
                    }
                }
                Object recordsTotal = jobGroupMsg.get("recordsTotal");
                Page<Map<String, Object>> result = new PageImpl(list, pageable, Integer.valueOf(recordsTotal == null ? "0" : recordsTotal + ""));
                return JsonResponse.success(result);
            }
            return JsonResponse.fail("执行器查询异常!" + jobGroupMsg.get("msg"));
        } catch (IOException e) {
            return JsonResponse.fail("执行器查询异常!" + e);
        }
    }


    /**
     * 分页查询任务列表
     *
     * @param page            当前页码
     * @param rows            每页数量
     * @param direction       排序规则
     * @param properties      排序规则
     * @param jobGroup        执行器id
     * @param triggerStatus   状态(-1 全部,0 停止,1 启动)
     * @param jobDesc         任务描述
     * @param executorHandler handler
     * @return
     */
    @Override
    public JsonResponse jobInfoPageList(int page, int rows, String direction, String properties, String jobGroup, String triggerStatus, String jobDesc, String executorHandler) {
        Pageable pageable = getPageable(page, rows, direction, properties);
        Map<String, Object> param = new HashMap<>();
        page -= 1;
        param.put("start", page < 0 ? "0" : page);
        param.put("length", rows);
        if (StringUtils.isBlank(jobGroup)) {
            return JsonResponse.fail("未选择执行器!");
        }
        param.put("jobGroup", Integer.valueOf(jobGroup));
        param.put("triggerStatus", Integer.valueOf(triggerStatus));
        if (StringUtils.isNotBlank(jobDesc)) {
            param.put("jobDesc", jobDesc);
        }
        if (StringUtils.isNotBlank(executorHandler)) {
            param.put("executorHandler", executorHandler);
        }

        JSONObject paramObject = new JSONObject(param);
        try {
            JSONObject jobGroupMsg = xxlJobClient.jobInfoPageList(paramObject);//向xxljob发送请求
            Object data = jobGroupMsg.get("data");
            if (data != null) {
                List<Object> list = new ArrayList<Object>();
                if (data instanceof ArrayList<?>) {
                    for (Object o : (List<?>) data) {
                        list.add(o);
                    }
                }
                Object recordsTotal = jobGroupMsg.get("recordsTotal");
                Page<Map<String, Object>> result = new PageImpl(list, pageable, Integer.valueOf(recordsTotal == null ? "0" : recordsTotal + ""));
                return JsonResponse.success(result);
            }
            log.error("分页查询任务列表接口调用xxljob异常{}", jobGroupMsg.get("msg"));
            return JsonResponse.fail("任务列表查询异常_xxljob " + jobGroupMsg.get("msg"));
        } catch (IOException e) {
            log.error("分页查询任务列表接口异常{}", e);
            return JsonResponse.fail("任务查询异常!" + e);
        }
    }

    @Override
    public JsonResponse createTask(XxlJobInfoVO xxlJobInfoVO) {
        Map<String, Object> map = (Map<String, Object>) MapUtil.objectToMap(xxlJobInfoVO);

        map.put("schedule_conf_FIX_RATE", "");
        map.put("schedule_conf_FIX_DELAY", "");
        switch (xxlJobInfoVO.getGlueType()) {
            case "BEAN": {//BEAN
            }
            case "GLUE_GROOVY": {//GLUE_JAVA
                if (StringUtils.isEmpty(xxlJobInfoVO.getGlueSource())) {
                    map.put("glueSource", getGlueSourceStr(xxlJobInfoVO));//待执行代码块初始化置空
                }
            }
        }

        JSONObject jsonObject = new JSONObject(map);
        try {
            JSONObject clientResp = xxlJobClient.createJob(jsonObject);//返回任务id,删除执行器时,要用此id,根据你的业务保存在业务库
            if (clientResp.get("code") == null || !"200".equals(clientResp.get("code").toString())) {
                return JsonResponse.fail("任务创建失败!" + clientResp.get("msg"));
            }
            Object taskId = clientResp.get("content");
            System.out.println("任务Id:" + taskId);
            return JsonResponse.success(taskId, "任务创建成功!");
        } catch (IOException e) {

            return JsonResponse.fail("任务创建失败!");
        }
    }

    /**
     * @param appName
     * @return
     */
    @Override
    public Integer getJobGroupByAppName(String appName) {

        JSONObject clientResp = null;
        try {
            clientResp = xxlJobClient.getJobGroupByAppName(appName);//返回任务id,删除执行器时,要用此id,根据你的业务保存在业务库
        } catch (IOException e) {
            log.error("getJobGroupByAppName 执行器查询失败,{}", e);
            return null;
        }
        if (clientResp.get("code") == null || !"200".equals(clientResp.get("code").toString())) {
            log.error("getJobGroupByAppName xxljob调度请求失败,{}", clientResp.get("msg"));
            return null;
        }
        Object content = clientResp.get("content");
        return Integer.valueOf(content + "");
    }

    @Override
    public JsonResponse createExecutor(String executorName) {
        Map<String, Object> map = new HashMap<>();
        map.put("title", executorName);
        map.put("appname", appname);
        map.put("addressType", 0);
        JSONObject jsonObject = new JSONObject(map);
        try {
            JSONObject jobGroupMsg = xxlJobClient.createJobGroup(jsonObject);
            Object code = jobGroupMsg.get("code");
            if (code != null && StrUtil.equals(code.toString(), "200")) {
                Object executorId = jobGroupMsg.get("content");
                return JsonResponse.success(executorId);
            }
            return JsonResponse.fail("执行器创建异常!" + jobGroupMsg.get("msg"));
        } catch (IOException e) {
            log.error("--->>>创建执行器_createExecutor 异常{}", e);
            return JsonResponse.fail("执行器创建异常!");
        }
    }

    @Override
    public JsonResponse startJobOnce(String id, String executorParam, String addressList) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("executorParam", executorParam);
        map.put("addressList", addressList);
        JSONObject jsonObject = new JSONObject(map);
        JSONObject jobGroupMsg = null;
        try {
            jobGroupMsg = xxlJobClient.startJobOnce(jsonObject);
        } catch (IOException e) {
            log.error("startJobOnce执行失败,{}", e);
            return JsonResponse.fail("执行失败!");
        }
        Object code = jobGroupMsg.get("code");
        if (code != null && StrUtil.equals(code.toString(), "200")) {
            return JsonResponse.success("任务启动成功!");
        }
        return JsonResponse.fail(jobGroupMsg.get("msg"));
    }

    @Override
    public JsonResponse startTask(String taskId) {
        if (StringUtils.isEmpty(taskId)) {
            return JsonResponse.fail("任务id不能为空!");
        }
        Map<String, Object> map = new HashMap<>();
        map.put("id", taskId);//第二步,创建任务返回的taskId
        try {
            xxlJobClient.startJob(Integer.valueOf(taskId));
        } catch (IOException e) {
            return JsonResponse.success("任务启动失败!");
        }
        return JsonResponse.success("任务启动成功!");
    }

    @Override
    public JsonResponse deleteTask(String taskId) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", taskId);//第二步,创建任务返回的taskId
        try {
            xxlJobClient.deleteJob(Integer.valueOf(taskId));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return JsonResponse.success("任务删除成功!");
    }

    @Override
    public JsonResponse stopTask(String taskId) {
        JSONObject jsonObject = null;
        try {
             jsonObject = xxlJobClient.stopJob(Integer.valueOf(taskId));
        } catch (IOException e) {
            log.error("任务停止失败,{}", e);
        }
        return JsonResponse.success(jsonObject);
    }
    

    /**
     * http请求统一方法
     *
     * @param url
     * @param method
     * @param data
     */
    private void getRequest(String url, String method, String data) {
        // request
        HttpURLConnection connection = null;
        BufferedReader bufferedReader = null;
        try {
            // connection
            URL realUrl = new URL(url);
            connection = (HttpURLConnection) realUrl.openConnection();
            boolean isPostMethod = method.equals("POST");
            // connection setting
            connection.setRequestMethod(method);
            connection.setDoOutput(isPostMethod);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setReadTimeout(5 * 1000);
            connection.setConnectTimeout(3 * 1000);
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");

            // do connection
            connection.connect();

            // data
            if (isPostMethod && data != null && data.trim().length() > 0) {
                DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
                dataOutputStream.write(data.getBytes("UTF-8"));
                dataOutputStream.flush();
                dataOutputStream.close();
            }

            // valid StatusCode
            int statusCode = connection.getResponseCode();
            if (statusCode != 200) {
                throw new RuntimeException("Http Request StatusCode(" + statusCode + ") Invalid.");
            }

            // result
            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
            }
            String responseMsg = result.toString();

            XxlJobHelper.log(responseMsg);

            return;
        } catch (Exception e) {
            XxlJobHelper.log(e);

            XxlJobHelper.handleFail();
            return;
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (connection != null) {
                    connection.disconnect();
                }
            } catch (Exception e2) {
                XxlJobHelper.log(e2);
            }
        }

    }


    /**
     * get 请求(请求头,参数,url)
     *
     * @param url          请求地址
     * @param param        请求参数
     * @param headersParam 请求头参数
     */
    private ResponseEntity<String> doGetRequest(String url, Map<String, Objects> param, Map<String, Objects> headersParam) {
        //封装请求参数
        try {
            if (param.size() > 0) {
                url += "?";
                int i = 0;
                for (String key : param.keySet()) {
                    Objects value = param.get(key);
                    if (i < param.size() - 1) {
                        url += key + ":" + value + "&";
                    } else {
                        url += key + ":" + value;
                    }
                }
            }
            //封装请求头
            HttpHeaders headers = new HttpHeaders();
            headers.add("connection", "Keep-Alive");
            headers.add("Content-Type", "application/json;charset=UTF-8");
            headers.add("Accept-Charset", "application/json;charset=UTF-8");
            for (String key : headersParam.keySet()) {
                headers.add(key, headersParam.get(key) + "");
            }
            //封装请求头
            HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, formEntity, String.class);
            return response;
        } catch (RestClientException e) {
            log.error("doGetRequest 请求异常!{}", e);
            return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }


    /**
     * @param url
     * @param param
     * @param headersParam
     * @param body
     */
    private ResponseEntity<String> doPostRequest(String url, Map<String, Objects> param, Map<String, Objects> headersParam, String body) {
        // 1.请求参数
        if (param.size() > 0) {
            url += "?";
            int i = 0;
            for (String key : param.keySet()) {
                Objects value = param.get(key);
                if (i < param.size() - 2) {
                    url += key + ":" + value + "&";
                } else {
                    url += key + ":" + value;
                }

            }
        }

        // 2.请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("connection", "Keep-Alive");
        httpHeaders.add("Content-Type", "application/json;charset=UTF-8");
        httpHeaders.add("Accept-Charset", "application/json;charset=UTF-8");
        for (String paramKey : headersParam.keySet()) {
            httpHeaders.add(paramKey, headersParam.get(paramKey) + "");
        }
        // 3.请求头 & 请求体
        HttpEntity<String> fromEntity = new HttpEntity<>(body, httpHeaders);
        return restTemplate.exchange(url, HttpMethod.POST, fromEntity, String.class);

    }


    /**
     * form-data的post 请求
     *
     * @param params
     * @param url
     * @param resourcesUrl
     * @param fileName
     * @return
     */
    private ResponseEntity<String> doPostFormDataRequest(MultiValueMap<String, Object> params, String url, String resourcesUrl, String fileName) {

        //通过url获取文件资源
        ByteArrayResource contentsAsResource = null;
        try {
//            contentsAsResource = getResourceByUrl("http://192.168.1.1:9300/statics/project_61/safety/2021/12/22/cfc8b2e9-4536-44cb-a098-25cc6ed84e6b.jpg","ces.jpg");
            contentsAsResource = getResourceByUrl(resourcesUrl, fileName);
        } catch (IOException e) {

        }
        params.add("files", contentsAsResource);
        List<FileInfo> fileInfos = new ArrayList<>();
        // 同上面指定的文件名
//        fileInfos.add(FileInfo.builder().fileName("ces.jpg").documentType("GC0013001")
//                .unitProjectId("dc77d2c538cb4491a4b6aea006f9e48f").documentDirectoryId("3015").build());
        params.add("fileInfos", fileInfos);


        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(params, headers);
        return restTemplate.postForEntity(url, httpEntity, String.class);
    }


    /**
     * 通过url获取文件资源
     *
     * @param url
     * @param fileName
     * @return
     * @throws IOException
     */
    private ByteArrayResource getResourceByUrl(String url, String fileName) throws IOException {
        // 通过url获取输入流
        InputStream inputStream = getFileInputStream(url);
        // 读取输入流到字节数组
        byte[] bytes = readBytes(inputStream);
        // 将自己数组转为文件资源
        return new ByteArrayResource(bytes) {
            @Override
            public String getFilename() {
                // 指定文件名称
                return fileName;
            }
        };
    }

    /*读取网络文件*/
    private InputStream getFileInputStream(String path) {
        URL url = null;
        try {
            url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置超时间为3秒
            conn.setConnectTimeout(3 * 1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //得到输入流
            return conn.getInputStream();
        } catch (Exception e) {
            log.error("读取网络文件异常:" + path);
        }
        return null;
    }

    /**
     * 读取输入流到字节数组
     *
     * @param in
     * @return
     * @throws IOException
     */
    private byte[] readBytes(InputStream in) throws IOException {
        //读取字节的缓冲
        byte[] buffer = new byte[1024];
        //最终的数据
        byte[] result = new byte[0];
        int size = 0;
        while ((size = in.read(buffer)) != -1) {
            int oldLen = result.length;
            byte[] tmp = new byte[oldLen + size];
            if (oldLen > 0) {//copy 旧字节
                System.arraycopy(result, 0, tmp, 0, oldLen);
            }
            //copy 新字节
            System.arraycopy(buffer, 0, tmp, oldLen, size);

            result = tmp;
        }
        return result;
    }


}

本机xxljob配置

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.accessToken=default_token
xxl.job.executor.appname=deaiop-executor
xxl.job.executor.port=9985
xxl.job.executor.logpath=logs/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
xxl.job.executor.address=
xxl.job.executor.ip=

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再写一行代码就下班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值