Spring批处理作业启动参数递增的同一作业
我期待着处理一个大的树,一级一级。作业1将具有参数1,作业2将获取参数2,等等。。。每个作业在仍有一个级别需要处理时调用下一个作业 我有一个处理数据的tasklet,然后在里面我尝试启动下一个作业,但在jobrepository中检测到异常Spring批处理作业启动参数递增的同一作业,spring,spring-boot,spring-batch,Spring,Spring Boot,Spring Batch,我期待着处理一个大的树,一级一级。作业1将具有参数1,作业2将获取参数2,等等。。。每个作业在仍有一个级别需要处理时调用下一个作业 我有一个处理数据的tasklet,然后在里面我尝试启动下一个作业,但在jobrepository中检测到异常现有事务 虽然不确定,但我知道从另一个作业的execute函数启动作业不是一个好主意 我切换到添加一个JobExecutionListener并在afterJob()方法中启动下一个级别,允许我使用ExecutionContext提取参数并将其递增发送到下一个
现有事务
虽然不确定,但我知道从另一个作业的execute函数启动作业不是一个好主意
我切换到添加一个JobExecutionListener
并在afterJob()
方法中启动下一个级别,允许我使用ExecutionContext
提取参数并将其递增发送到下一个作业
我现在面临的问题是:
BatchConfig
在配置中声明作业
启动第一个作业的服务通过@Resource导入作业
监听器被添加到BatchConfig
侦听器必须链接到服务才能启动作业
如何注入服务以在侦听器中启动作业?它不是bean,通过构造函数传递它会导致循环依赖
我认为我的设计是错误的,但我不知道如何正确地执行此操作。嵌套作业将导致问题,并使故障排除更加困难
您可以做的不是从另一个作业启动作业,而是在正在处理您的级别的作业上添加一个
然后在afterJob(JobExecution JobExecution)
回调中,您可以:
- 检查作业的
ExitStatus
- 运行下一个作业
这需要一些退出条件,否则你将永远循环,你将需要告诉下一个作业处理下一个级别。这两者都可以通过几种方式实现:
- 添加一个参数,以便可以传递参数
- 使用
ChunkContext
这两种解决方案都允许您通过ExecutionContext
传递参数。从作业启动作业不是一个好主意。可能是您正在寻找的,因为它允许您启动一个作业的作业(尽管需要预先分析图以了解应启动多少(子)作业).@MahmoudBenHassine我看了看,试了试,台阶起作用了。现在的问题是,在构建作业时,我不知道树的深度(数据库中有许多树),既然作业是在调用启动之前创建的(因此我不知道在哪棵树上),我应该如何获取这些信息,这种方法需要对树进行预分析,以计算预先启动的步骤数。否则,我不确定SpringBatch是否适合您的用例(或者至少是您打算使用它的方式)。