如何修改 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。
我已经设法在 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。