如何修改 spring 批处理的作业参数?

How to modify job parameter on spring batch?

我已经设法在 Tasklet 上获得作业参数上下文,但我不知道如何更改此值以便下一个 Tasklet 可以访问修改后的值

val params = JobParametersBuilder()
    .addString("transaction", UUID.randomUUID().toString())
    .addDouble("amount", 0.0)

jobLauncher.run(
    paymentPipelineJob,
    params.toJobParameters()
)

第一个任务:

override fun beforeStep(stepExecution: StepExecution) {
    logger.info("[$javaClass] - task initialized.")

    this.amount = stepExecution.jobParameters.getDouble("amount")

    // Prints 0.0
    logger.info("before step: ${this.amount}")
}

override fun afterStep(stepExecution: StepExecution): ExitStatus? {
    // Change the execution content to pass it to the next step
    stepExecution.jobExecution.executionContext.put("amount", this.amount!! + 3)

    // Still prints 0.0
    logger.info("after step: ${stepExecution.jobParameters.getDouble("amount")}")
    logger.info("[$javaClass] - task ended.")
    return ExitStatus.COMPLETED
}

如何修改作业参数以便所有步骤都可以访问它?

虽然执行上下文是可变对象,但作业参数 are immutable。因此,一旦启动执行就无法修改它们。

就是说,根据您共享的代码,您在作业执行上下文中放置了一个属性 amount 并期望从作业参数实例中看到修改后的值。这是一个错误的期望。执行上下文和作业参数是两个不同的对象,不是“inter-connected”。

编辑:添加关于如何处理用例的建议

您可以使用执行上下文在步骤之间共享数据。你已经在你的例子中这样做了:

stepExecution.jobExecution.executionContext.put("amount", this.amount!! + 3)

一旦在侦听器中完成步骤 1 之后,您就可以在侦听器 之前 步骤 2 中从 EC 获取值:

double amount = stepExecution.jobExecution.executionContext.get("amount");

请检查参考文档中的 Passing Data to Future Steps