您在使用 SchedulerX 过程中会碰到一些问题。本文将介绍如何处理一些典型的使用问题。

机器繁忙

  • 现象

    应用管理页面某个分组的操作列单击连接机器连接机器面板中该机器的状态繁忙

    连接机器
  • 可能的原因
    • 机器的load5(负载)超过在创建任务分组时设置的阈值。
    • 机器的内存使用率超过在创建任务分组时设置的阈值。
    • 机器的磁盘使用率超过在创建任务分组时设置的阈值。
  • 影响

    机器状态为繁忙,将导致无法触发调度任务。

  • 处理方法
    1. 连接机器,面板中,将光标放到繁忙上,查看机器的 load5内存使用率磁盘使用率
    2. 根据 load5内存使用率磁盘使用率的值,确认繁忙的原因并进行相应的处理。例如清理磁盘、释放内存或负载。

      如果处理之后,机器仍然繁忙,可以升级机器的配置。

    如果只是用于测试,机器繁忙也想继续触发任务,可以在应用管理页面的操作列单击更多,在列表中单击编辑,然后修改编辑应用管理面板中的高级配置,启用不触发繁忙机器

    编辑应用分组-高级配置

暂无可用机器

  • 现象

    当的应用接入任务调度并部署到 EDAS,通过连接机器验证是否成功时,弹出暂无可用机器的提示。

  • 可能的原因
    • 应用接入任务调度失败
    • JAR 包冲突
    • SchedulerXWorker 配置错误
  • 处理方法
    1. 登录部署应用的 ECS 实例,查看是否存在日志目录 /home/${user.home}/logs/schedulerx/worker.log
      说明
      • 如果是 root 账号启动的进程,日志在 /root/logs/schedulerx/worker.log
      • 如果是 admin 账户启动的进程,日志在 /home/admin/scheduelrx/worker.log
    2. 查看worker.log日志是否有异常日志。

      • 如果日志包含 groupId is not existed,说明是配置问题。在 worker.log 里搜索 Schedulerx WorkerConfig,可以看到当前的配置,然后和控制台对比、确认。
        注意 namespace 要填分布式任务调度 2.0-命名空间页面的命名空间ID
      • 如果有异常日志,确认是否是 JAR 包冲突。详情请参见JAR 包冲突
      • 如果没有异常日志,搜索“started”,检查 SchedulerXWorker 的配置是否正确。

JAR 包冲突

  • 现象

    部署调度任务时,提示 JAR 包冲突

  • 可能的原因

    JAR 包冲突可能包含其中具体子包冲突的多种可能的原因。 可以在日志里搜一下maven dependencies,可以看到每个 JAR 的版本和路径,帮助快速定位和解决 JAR 包冲突,如下图。

    mvn_dependencies
  • 处理方法

    然后参照下表,升级低版本。

    JAR 包 版本
    guava 20.0
    com.typesafe.config 1.3.0
    protobuf-java 2.6.1
    io.netty 3.10.6.Final
    javaassist 3.21.0-GA
    hessian 4.0.51
    commons-configuration 1.10
    commons-validator 1.4.0
  • 示例

    下面列出几个典型的 JAR 冲突现象:

    • protobuf 冲突JAR 包冲突-protobuf
    • Netty 冲突JAR 包冲突-Netty
    • Netty 或者 protobuf 冲突JAR 包冲突-Netty或Protobuf

Spring 应用找不到 Bean

  • 现象

    Spring 应用找不到对应的 Bean。

  • 可能的原因
    • 接入方式不正确。
    • JobProcessor 中未注入 Bean。
    • pom.xml 中添加了 spring-boot-devtools 依赖。
    • 在 JobProcessor 和 process 方法中添加了事务注解。
  • 处理方法
    1. 应用管理页面该分组的操作列单击连接机器连接机器面板中查看启动方式是否为 Spring 或 Spring Boot。
      • 是,执行下一步。
      • 否,请检查您的应用。
    2. 检查应用代码中是否将 JobProcessor 注入为 Bean,例如添加了 @Component 注解。
      • 是,执行下一步。
      • 否,将 JobProcessor 注入为 Bean。
    3. 检查 pom.xml 中是否添加了 spring-boot-devtools
      • 是,删除该依赖。
      • 否,执行下一步。
    4. 检查 JobProcessor 和 process 方法中是否添加了事务注解。
      • 是,删除该注解。
      • 否,联系 SchedulerX 技术支持人员。

tablestore protobuf-2.4.1 和 SchedulerX 不兼容

请参见使用 Java SDK 时遇到 Protobuf 或 HttpClient 库冲突

任务运行中卡住

  • 现象

    调度任务一直处于执行中,不能结束。

  • 可能的原因
    • 业务的问题
    • SchedulerX 的问题
  • 解决方法

    schedulerx-worker 执行每个 processor 的时候会把任务实例 ID 放到线程名中,方便查看线程栈。这里以分布式任务某个子任务卡住为例,单机执行/广播执行类似的解决方法类似。

    1. 在控制台执行列表页面查看卡住的任务实例的详情,获取实例 ID。执行列表-任务实例详情
    2. 登录卡住的机器,执行 jstack [pid] | grep [实例id] -A 20,查看线程栈。
      • 如果执行结果和下图相似,说明是业务的问题。任务卡住-业务问题
      • 否则,请联系 SchedulerX 技术支持人员。