接入问题

更新时间:
复制为 MD 格式

本文旨在为您介绍在使用任务调度实例版(XXL-JOB)时,遇到的接入相关问题,通过详细解析这些问题,您将能够更好地理解和解决在接入过程中可能遇到的问题,确保任务调度系统的稳定运行。

域名解析错误,报错java.net.UnknownHostException

XXL-JOB的域名使用的是privatezone,需要使用100.100.2.136100.100.2.138,如果您修改过路由或者DNS配置,需要将这两个IP的路由规则删除后,以确保域名能够自动解析到。

您可以使用Dig域名的方式来定位,如下图所示,Dig域名返回的DNS服务器地址是114.114.114.114,说明存在问题。

image

使用CEN打通网络,另一个VPC无法解析域名

提工单联系研发同学,将privatezone映射到其他VPC中。

使用运营商专线打通网络,在自建IDC或者办公网无法解析域名

详见转发管理

2.0.x版本升级到新的SDK版本,同一个IP会出现两个Executor

如果从xxl-job-core2.0.x版本或者更低的版本升级到新的SDK,同一个IP会出现两个Executor。如下图:

image

原因是新的SDKXxljobExecutor的初始化逻辑发生变化,以下代码需要去除Bean中的initMethoddestroyMethod,否则XxlJobSpringExecutor将会调用两次start

@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
    logger.info(">>>>>>>>>>> xxl-job config init.");
    XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    xxlJobSpringExecutor.setAppName(appName);
    xxlJobSpringExecutor.setIp(ip);
    xxlJobSpringExecutor.setAccessToken(accessToken);
    xxlJobSpringExecutor.setLogPath(logPath);
    xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

    return xxlJobSpringExecutor;
}

如何处理nodejs版本的SDK接入存在无法接受应答的问题

步骤一:
import type { Request, Response, NextFunction } from 'express'
const JSONbig = require('json-bigint');

步骤二:
/**
 * Safe JSON parsing middleware that preserves large integers as strings
 * This prevents precision loss for large logId values that exceed Number.MAX_SAFE_INTEGER
 */
const safeJsonMiddleware = function () {
  return (req: Request, res: Response, next: NextFunction) => {
    if (req.is('application/json')) {
      let body = ''
      req.setEncoding('utf8')
      
      req.on('data', (chunk) => {
        body += chunk
      })
      
      req.on('end', () => {
        try {
          // 使用 JSONbig.parse() 而不是 JSON.parse()
          // 'storeAsString: true' 会将大数解析为字符串
          // 如果想解析为 BigInt,可以使用 'useNativeBigInt: true'
          req.body = JSONbig({ storeAsString: true }).parse(body);
          next();
        } catch (e) {
          // 如果解析失败,返回错误
          res.status(400).send('Invalid JSON');
        }
      })
      
      req.on('error', next)
    } else {
      next()
    }
  }
}

步骤三:
app.use(safeJsonMiddleware())