【发布时间】:2020-07-15 06:40:38
【问题描述】:
我希望逐级处理一棵大树。作业 1 将具有参数 1,作业 2 将获取参数 2,依此类推......每个作业都会调用下一个作业,而仍有一个级别要处理。
我有一个在其中处理数据的 tasklet,然后我尝试在其中启动下一个作业,但出现异常 existing transaction detected in jobrepository。
虽然不确定,但我知道从另一个执行功能启动作业不是一个好主意。
我切换到添加JobExecutionListener 并在afterJob() 方法中启动下一个级别,允许我使用ExecutionContext 提取参数并将它们递增发送到下一个作业。
我现在面临的问题如下;
-
BatchConfig在配置中声明作业 - 启动第一个作业的服务通过 @Resource 导入作业
- 监听器被添加到
BatchConfig - 监听器必须链接到服务才能启动作业
- 如何注入服务以在侦听器内启动作业?它不是 bean,通过构造函数传递它会导致循环依赖。
我认为我的设计有误,但我不知道如何正确地做到这一点。
【问题讨论】:
-
从 Job 启动 Job 不是一个好主意。
-
可能JobStep 是您正在寻找的东西,因为它允许您启动一项工作(尽管它需要预先分析图表以了解有多少(子)工作应该启动)。
-
@MahmoudBenHassine 我查看并尝试了,这些步骤有效。现在的问题是,在构建作业时,我不知道树的深度(数据库中有很多树),我应该如何获取这些信息,因为作业是在调用启动之前创建的(因此我不知道)不知道在哪棵树上)?
-
这就是我所说的,这种方法需要对树进行预先分析,以计算预先启动的步骤数。否则,我不确定 Spring Batch 是否适合您的用例(或者至少是您打算使用它的方式)。
标签: spring spring-boot spring-batch