【问题标题】:Spring batch job launching same job with incremented parametersSpring批处理作业启动具有递增参数的相同作业
【发布时间】:2020-07-15 06:40:38
【问题描述】:

我希望逐级处理一棵大树。作业 1 将具有参数 1,作业 2 将获取参数 2,依此类推......每个作业都会调用下一个作业,而仍有一个级别要处理。

我有一个在其中处理数据的 tasklet,然后我尝试在其中启动下一个作业,但出现异常 existing transaction detected in jobrepository

虽然不确定,但我知道从另一个执行功能启动作业不是一个好主意。

我切换到添加JobExecutionListener 并在afterJob() 方法中启动下一个级别,允许我使用ExecutionContext 提取参数并将它们递增发送到下一个作业。

我现在面临的问题如下;

  1. BatchConfig 在配置中声明作业
  2. 启动第一个作业的服务通过 @Resource 导入作业
  3. 监听器被添加到BatchConfig
  4. 监听器必须链接到服务才能启动作业
  5. 如何注入服务以在侦听器内启动作业?它不是 bean,通过构造函数传递它会导致循环依赖。

我认为我的设计有误,但我不知道如何正确地做到这一点。

【问题讨论】:

  • 从 Job 启动 Job 不是一个好主意。
  • 可能JobStep 是您正在寻找的东西,因为它允许您启动一项工作(尽管它需要预先分析图表以了解有多少(子)工作应该启动)。
  • @MahmoudBenHassine 我查看并尝试了,这些步骤有效。现在的问题是,在构建作业时,我不知道树的深度(数据库中有很多树),我应该如何获取这些信息,因为作业是在调用启动之前创建的(因此我不知道)不知道在哪棵树上)?
  • 这就是我所说的,这种方法需要对树进行预先分析,以计算预先启动的步骤数。否则,我不确定 Spring Batch 是否适合您的用例(或者至少是您打算使用它的方式)。

标签: spring spring-boot spring-batch


【解决方案1】:

嵌套作业会导致问题,并使故障排除更加困难。

您可以在处理您的关卡的作业上添加JobExecutionListener,而不是从另一个作业启动。

那么在afterJob(JobExecution jobExecution)回调中,你可以:

  • 查看作业的ExitStatus
  • 运行下一个作业

这需要一些退出条件,否则你将永远循环下去,你需要告诉下一个作业来处理下一个级别。这两者都可以通过多种方式实现:

两种解决方案都允许您通过 ExecutionContext 传递参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多