Spring 批处理作业使用递增的参数启动相同的作业
Spring batch job launching same job with incremented parameters
我想逐级处理一棵大树。作业 1 将具有参数 1,作业 2 将获得参数 2,等等...每个作业调用下一个作业,同时仍有一个级别要处理。
我有一个在其中处理数据的 tasklet,然后在里面我尝试启动下一个作业,但出现异常 existing transaction detected in jobrepository
。
虽然不确定,但我知道从另一个作业的执行函数启动作业不是一个好主意。
我切换到添加 JobExecutionListener
并在 afterJob()
方法中启动下一个级别,允许我使用 ExecutionContext
提取参数并将它们递增到下一个工作。
我现在面临的问题是:
BatchConfig
在配置中声明作业
- 启动第一个作业的服务通过@Resource
导入作业
- Listener 添加在
BatchConfig
中
- 侦听器必须 link 服务才能启动作业
- 如何注入服务以在侦听器中启动作业?它不是一个 bean,通过构造函数传递它会导致循环依赖。
我想我的设计有误,但我不知道如何正确地做到这一点。
嵌套作业会导致问题并使故障排除更加困难。
您可以在正在处理关卡的作业上添加 JobExecutionListener
,而不是从另一个作业启动作业。
然后在afterJob(JobExecution jobExecution)
回调中,您可以:
- 检查作业的
ExitStatus
- 运行下一个工作
这需要一些退出条件,否则你将永远循环下去,你将需要告诉下一个作业处理下一个级别。这些都可以通过多种方式实现:
- 添加一个
ExecutionContextPromotionListener
以便可以传递参数
- 直接在 Step 的 Tasklet 中使用
ChunkContext
这两种解决方案都允许您通过 ExecutionContext
传递参数
我想逐级处理一棵大树。作业 1 将具有参数 1,作业 2 将获得参数 2,等等...每个作业调用下一个作业,同时仍有一个级别要处理。
我有一个在其中处理数据的 tasklet,然后在里面我尝试启动下一个作业,但出现异常 existing transaction detected in jobrepository
。
虽然不确定,但我知道从另一个作业的执行函数启动作业不是一个好主意。
我切换到添加 JobExecutionListener
并在 afterJob()
方法中启动下一个级别,允许我使用 ExecutionContext
提取参数并将它们递增到下一个工作。
我现在面临的问题是:
BatchConfig
在配置中声明作业- 启动第一个作业的服务通过@Resource 导入作业
- Listener 添加在
BatchConfig
中
- 侦听器必须 link 服务才能启动作业
- 如何注入服务以在侦听器中启动作业?它不是一个 bean,通过构造函数传递它会导致循环依赖。
我想我的设计有误,但我不知道如何正确地做到这一点。
嵌套作业会导致问题并使故障排除更加困难。
您可以在正在处理关卡的作业上添加 JobExecutionListener
,而不是从另一个作业启动作业。
然后在afterJob(JobExecution jobExecution)
回调中,您可以:
- 检查作业的
ExitStatus
- 运行下一个工作
这需要一些退出条件,否则你将永远循环下去,你将需要告诉下一个作业处理下一个级别。这些都可以通过多种方式实现:
- 添加一个
ExecutionContextPromotionListener
以便可以传递参数 - 直接在 Step 的 Tasklet 中使用
ChunkContext
这两种解决方案都允许您通过 ExecutionContext