记一次xxl_job中HttpJobHandler中的数据请求与存储

博客提到HttpURLConnection可封装成工具类,使用时只需传入param参数。这为相关开发提供了便利,简化了操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@JobHandler(value = "httpJobHandler")
@Component
public class HttpJobHandler extends IJobHandler {

    @Resource
    private BankSynchronizationService bankSynchronizationService;

    @Override
    public ReturnT<String> execute(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, HTTP请求.");

        // request
        HttpURLConnection connection = null;
        BufferedReader bufferedReader = null;
        try {
            // connection
            URL realUrl = new URL(param);
            connection = (HttpURLConnection) realUrl.openConnection();
            System.out.println(param + "------param");
            // connection setting
            connection.setRequestMethod("POST");
            //connection.setur
            connection.setDoOutput(true);
            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");
            // 设置接收类型否则返回415错误
            connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");

            // do connection
            connection.connect();

            //Map<String, List<String>> map = connection.getHeaderFields();
            String bankDate = bankSynchronizationService.findDate();
            DateFormat bf = new SimpleDateFormat("yyyy.MM.dd");
            String date = bf.format(new Date());
            System.out.println(date + "----date");

            String date1 = date.substring(date.length() - 2);
            String bank = bankDate.substring(bankDate.length() - 2);

            int i1 = Integer.parseInt(date1) - Integer.parseInt(bank);

            JSONObject json = new JSONObject();
            json.put("dataTable", "insurance_bp_bank_i");
            json.put("limitLower", 0);
            json.put("limitUpper", 99);
            JSONArray array = new JSONArray();
            array.add("vertrag");
            array.add("gpart");
            array.add("bankno");
            json.put("returnFields", array);
            json.put("queryType", "query");
            JSONArray ordering = new JSONArray();
            ordering.add("vertrag");
            json.put("ordering", ordering);
            JSONObject innerJson = new JSONObject();
            innerJson.put("type", "in");
            innerJson.put("field", "chdat");
            JSONArray fieldsArray = new JSONArray();
            fieldsArray.add(bankDate);
            innerJson.put("values", fieldsArray);
            json.put("filter", innerJson);

            System.out.println(json.toString() + "----json");

            // valid StatusCode
            DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
            dos.write((json.toString()).getBytes());
            dos.flush();
            dos.close();

            int statusCode = connection.getResponseCode();
            System.out.println(statusCode + "-----statusCode");
            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();
            System.out.println(responseMsg + "-----responseMsg");
            //
            List<InsuranceBpBank> insuranceBpBanks = JSON.parseArray(responseMsg, InsuranceBpBank.class);
            for (InsuranceBpBank insuranceBpBank : insuranceBpBanks) {
                System.out.println("------------------------");
                System.out.println(insuranceBpBank.getVertrag());
                bankSynchronizationService.insertBank(insuranceBpBank);
            }
            XxlJobLogger.log(responseMsg);
            return SUCCESS;
        } catch (Exception e) {
            XxlJobLogger.log(e);
            return FAIL;
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (connection != null) {
                    connection.disconnect();
                }
            } catch (Exception e2) {
                XxlJobLogger.log(e2);
            }
        }

    }

}

HttpURLConnection 可以封装成工具类,只需要传入param参数即可。

<think>好的,我现在需要帮助用户构造一个MySQL语句,将xxl_job_info表中job_group等于29的数据复制并插入到同一张表中。首先,我需要确认用户的需求:他们希望选择特定条件的数据,并将这些数据插入回同一个表。这意味着需要处理自增主键和可能的唯一约束问题。 首先,我应该回顾一下INSERT INTO SELECT语句的基本用法。通常的语法是INSERT INTO 表名 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 表名 WHERE 条件。但是,如果表中有自增主键,比如id,直接复制可能会导致主键冲突,因为原数据和新插入的数据的id会重复。因此,用户需要注意排除自增主键或者在插入时不包含该字段,让数据库自动生成新的id。 接下来,我需要参考用户提供的引用内容,特别是关于xxl_job_info表的描述。根据引用[1],xxl_job_info表存储任务配置信息,如调度类型、执行器路由策略等。假设这个表有一个自增主键id,那么在插入时如果不处理id,可能会导致重复。因此,正确的做法是在插入语句中省略id列,让数据库自动生成新的值。 然后,我需要考虑其他可能存在的唯一约束。例如,除了主键之外,是否有其他字段组合需要唯一,比如任务名(可能有一个唯一索引)。如果存在这样的约束,直接复制数据会导致插入失败。用户需要确保在复制时修改这些字段的值,或者在业务允许的情况下忽略这些约束。 现在,构造基本的SQL语句。假设表结构中有id(自增主键)、job_group和其他字段,正确的语句应该是: INSERT INTO xxl_job_info (job_group, 其他字段...) SELECT job_group, 其他字段... FROM xxl_job_info WHERE job_group = 29; 这里需要将“其他字段”替换为除id外的所有字段名。如果用户不确定字段名,可能需要先查询表结构,或者使用不包含id的显式字段列表。 此外,用户需要注意事务和性能问题。如果数据量很大,可能需要分批次插入或者调整事务隔离级别,避免锁表影响性能。 最后,提醒用户在实际操作前备份数据,并在测试环境验证,避免生产环境出现问题。如果有唯一约束,需要特别处理,例如修改任务名称或相关字段的值,确保插入的数据不会违反约束。</think>要实现将$xxl\_job\_info$表中$job\_group=29$的数据复制插入到同表,可以使用MySQL的`INSERT INTO SELECT`语句。但需要注意以下关键点: ### 步骤说明 1. **排除自增主键** 假设表中有自增主键$id$,插入时需排除该字段: ```sql INSERT INTO xxl_job_info (job_group, job_desc, author, alarm_email, executor_route_strategy, executor_handler, executor_param, ...) SELECT 29, -- 若需要修改job_group值则在此调整 job_desc, author, alarm_email, executor_route_strategy, executor_handler, executor_param, ... FROM xxl_job_info WHERE job_group = 29 ``` 2. **保留原$job_group$值** 若需保持原值则直接引用字段: ```sql INSERT INTO xxl_job_info (job_group, ...其他字段) SELECT job_group, -- 保持原分组值 ...其他字段 FROM xxl_job_info WHERE job_group = 29 ``` ### 注意事项 1. **必须显式指定字段** 需通过`SHOW CREATE TABLE xxl_job_info`确认所有字段名称,排除自增主键字段[^1] 2. **唯一性约束处理** 若存在唯一索引(如任务名称),需调整重复值: ```sql SELECT CONCAT(job_name,'_copy') AS job_name, -- 添加后缀避免重复 ...其他字段 ``` 3. **事务控制建议** 大数据量操作建议分批处理: ```sql START TRANSACTION; -- 执行插入语句 COMMIT; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值