Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xxl-job 提前注册,导致应用未启动完成,job 调度已发起,调度失败 #3532

Open
wkclz opened this issue Aug 20, 2024 · 0 comments

Comments

@wkclz
Copy link

wkclz commented Aug 20, 2024

Which version of XXL-JOB do you using?

  • 任意版本均有此问题

Expected behavior

  • xxl-job 发起调度时,应用应当已经启动完成,而不应该仅在 bean 生命周期之后

Actual behavior

  • 在 XxlJobExecutor 初始化完成之后(已经向 admin 发起了注册),应用其他 bean 还没初始化完成 (如数据库),若在这个阶段内,admin 的调用时间已经到来,应用接收到任务,会执行异常。

Steps to reproduce the behavior

  • xxl-job cron 设置为尽可能频繁的调度频率 (* * * * * ?),
  • 执行器所在服务器资源较少,应用启动过程复杂 (模拟启动较慢的场景),
  • 应用依赖于 MyBatis (有大量的 xml 需要解析,会让应用启动较慢)。
  • 重启应用,即可看到应用在重启过程,数据库操作的异常。
  • 查看调用栈:MyBatis xml 还没解析完,xxl-job 已经被调起,调用报错

Other information

修复建议1:

  1. 以 spring-boot-starter 方式提供 client 端
  2. 在 XxlJobExecutor 创建过程,只初始化好 基本参数,创建 client 基本信息, 但不立即向 admin 注册
  3. 设置个标志位(是否已就绪:否),并启动异步线程,若此标志位为 true, 才在异步线程中向 admin 注册
  4. 在 ApplicationListener 生命周期,将标志位设置为 true。
  5. XxlJobExecutor 的 destroy,还需要向 xxl-job 反注册

修复建议2:

  1. 在 ApplicationListener 生命周期,向 admin 汇报 ready 状态
  2. admin 在发起调度时,只调度已经 ready 的执行器。

附加:

  1. 提供 spring-boot-starter 可以有更低的接入门槛
  2. destroy 里向 admin 反注册,可以让停机更优雅
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant