我恶意地做了一个代码来检查批处理流是如何工作的。
@Bean
public Step conditionalJobStep1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step1");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step conditionalJobStep2() {
return stepBuilderFactory.get("conditionalJobStep2")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step2");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step conditionalJobStep3() {
return stepBuilderFactory.get("conditionalJobStep3")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step3");
return RepeatStatus.FINISHED;
}).build();
}
这里是步骤和任务。
@Bean
public Job stepNextConditionalJob() {
return jobBuilderFactory.get("stepNextConditionalJob")
.start(conditionalJobStep1())
.on("FAILED")
.to(conditionalJobStep3())
.on("*")
.end()
.from(conditionalJobStep1())
.on("*")
.to(conditionalJobStep3())
.next(conditionalJobStep2())
.on("*")
.to(conditionalJobStep1())
.on("*")
.end()
.end()
.build();
}
以上代码结果1-
我的想法:第一步没有失败,所以开始(1)-
但是,当我像这样修改了两个数字时(在from(step1)之后,只修改了Step2和Step3的代码),结果只有1-
@Bean
public Job stepNextConditionalJob() {
return jobBuilderFactory.get("stepNextConditionalJob")
.start(conditionalJobStep1())
.on("FAILED")
.to(conditionalJobStep3())
.on("*")
.end()
.from(conditionalJobStep1())
.on("*")
.to(conditionalJobStep2())
.next(conditionalJobStep3())
.on("*")
.to(conditionalJobStep1())
.on("*")
.end()
.end()
.build();
}
自己的许多实验都与“开始”之后的“to”有关。
我不知道为什么会这样。
这有什么区别?
您的流没有在*
上定义第2步的结果。您有:
.to(conditionalJobStep3())
.on("*")
.end()
和
.to(conditionalJobStep1())
.on("*")
.end()
但第二步没有这样的结构。您为第2步定义的唯一结果是:
.next(conditionalJobStep2())
.on("*")
.to(conditionalJobStep1())
这意味着无论step2的退出代码如何,都要转到条件JobStep1
。这就是为什么您会看到1-
我不知道为什么会这样。这有什么区别?
当您将步骤2与步骤3翻转时,它会起作用,因为您已经为步骤3在“*”上定义了一个结果:
。到(conditionalJobStep3()。在(“*”)上。end()
。
我建议使用以下语法定义每个步骤的所有结果:
jobBuilderFactory.get("stepNextConditionalJob")
.from(stepA).on(ExitCode1).to(StepB)
.from(stepA).on(ExitCode2).to(StepC)
.from(stepA).on("*").end()
...
.from(stepX).on(ExitCode1).to(StepY)
.from(stepX).on(ExitCode1).to(StepZ)
.from(stepX).on("*").end()
.build()
这更明确,也不容易忘记外向的过渡。
我正在做简单的Spring批量工作。当我启动作业时,它在无限循环中运行。它不会停止。根据我的时间表,它应该每10秒运行一次。但当工作开始时,它不会停止。它只是分别从读卡器、处理器和写入器打印系统输出。我正在为读者、处理者和作者创造工作机会。我正在按注释进行所有配置。不是通过xml。 下面是批处理配置 PersonReader。JAVA 人Writer.java 个人处理器。JAVA
需要读取spring批处理中的文件,对其进行处理并将其作为一个提要保存。一个提要包含50%的信息。当我必须持久化提要的最终结果时,我需要使用公共字段将它们组合起来,并像一个项目一样持久化。请参见下面的示例。 我需要保留的最终信息如下: 请建议我如何在我的Spring批工作中实现这一点。 谢谢
我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。
我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景: > 有两个不同的表说员工 使用时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...
我在表中总共有8条记录,其中6条在spring批处理调用read时可以使用jpareader。现在我将页面大小和块大小设置为1以进行测试。期望作业运行时,它应该进行6次读取调用,然后它应该逐个处理,逐个写入。但实际上发生的是,它只是调用read 4次(从日志中我可以看到这样读取页面0...1)并处理4个,其中一个由于不匹配写入标准而被过滤掉,然后它只是更新了3个记录,作业标记为成功完成。
我使用的是spring批处理,和通常使用的一样,我有读取器、处理器和写入器。 我有两个问题 1>Reader查询所有200条记录(表中记录总大小为200,我给出了pageSize=200),因此它得到所有200条记录,在处理器中,我们需要所有这些记录的列表,因为我们必须将每个记录与其他199条记录进行比较,以便将它们分组在不同的层中。因此我在想,如果我们能在处理步骤中得到那个列表,我就可以操纵它们