Spring批处理作业启动参数递增的同一作业

Spring批处理作业启动参数递增的同一作业,spring,spring-boot,spring-batch,Spring,Spring Boot,Spring Batch,我期待着处理一个大的树,一级一级。作业1将具有参数1,作业2将获取参数2,等等。。。每个作业在仍有一个级别需要处理时调用下一个作业 我有一个处理数据的tasklet,然后在里面我尝试启动下一个作业,但在jobrepository中检测到异常现有事务 虽然不确定,但我知道从另一个作业的execute函数启动作业不是一个好主意 我切换到添加一个JobExecutionListener并在afterJob()方法中启动下一个级别,允许我使用ExecutionContext提取参数并将其递增发送到下一个

我期待着处理一个大的树,一级一级。作业1将具有参数1,作业2将获取参数2,等等。。。每个作业在仍有一个级别需要处理时调用下一个作业

我有一个处理数据的tasklet,然后在里面我尝试启动下一个作业,但在jobrepository中检测到异常
现有事务

虽然不确定,但我知道从另一个作业的execute函数启动作业不是一个好主意

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

我现在面临的问题是:

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

  • 我认为我的设计是错误的,但我不知道如何正确地执行此操作。

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

    您可以做的不是从另一个作业启动作业,而是在正在处理您的级别的作业上添加一个

    然后在
    afterJob(JobExecution JobExecution)
    回调中,您可以:

    • 检查作业的
      ExitStatus
    • 运行下一个作业
    这需要一些退出条件,否则你将永远循环,你将需要告诉下一个作业处理下一个级别。这两者都可以通过几种方式实现:

    • 添加一个参数,以便可以传递参数
    • 使用
      ChunkContext

    这两种解决方案都允许您通过
    ExecutionContext

    传递参数。从作业启动作业不是一个好主意。可能是您正在寻找的,因为它允许您启动一个作业的作业(尽管需要预先分析图以了解应启动多少(子)作业).@MahmoudBenHassine我看了看,试了试,台阶起作用了。现在的问题是,在构建作业时,我不知道树的深度(数据库中有许多树),既然作业是在调用启动之前创建的(因此我不知道在哪棵树上),我应该如何获取这些信息,这种方法需要对树进行预分析,以计算预先启动的步骤数。否则,我不确定SpringBatch是否适合您的用例(或者至少是您打算使用它的方式)。