Spring batch 如何立即终止工作?

Spring batch 如何立即终止工作?,spring-batch,Spring Batch,我试图在我的工作运行时停止它。但这项工作不会立即停止。它仍在运行,然后抛出日志: 2019-12-03 13:23:48 [main] INFO o.s.b.c.r.s.SimpleJobRepository - Parent JobExecution is stopped, so passing message on to StepExecution 2019-12-03 13:23:48 [main] INFO o.s.b.c.s.ThreadStepInterruptionPolicy

我试图在我的工作运行时停止它。但这项工作不会立即停止。它仍在运行,然后抛出日志:

2019-12-03 13:23:48 [main] INFO  o.s.b.c.r.s.SimpleJobRepository - Parent JobExecution is stopped, so passing message on to StepExecution
2019-12-03 13:23:48 [main] INFO  o.s.b.c.s.ThreadStepInterruptionPolicy - Step interrupted through StepExecution
2019-12-03 13:23:48 [main] INFO  o.s.batch.core.step.AbstractStep - Encountered interruption executing step remindStep in job remindEntrustPayment : Job interrupted status detected.


如何立即终止作业?

无法强制立即关闭,尤其是当控件位于用户代码中时。在区块边界检查
StepInterruptionPolicy
(默认为您在日志中看到的
ThreadStepInterruptionPolicy
),此时控件返回到框架并停止作业(该部分将对此进行解释)


您可以使用
JobOperator#stop
或在适当的时候在代码中设置
StepExecution#setTerminateOnly
(例如使用侦听器)要求停止作业。

可能这就是您想要的:不,不是。它会停止工作,但不会立即停止。作业仍在运行以完成当前步骤我已使用Spring Cloud数据流控制我的Spring批处理作业。您是否有一些仅针对我的案例使用JobOperator#stop或StepExecution#Setterminate的示例?如果您使用SCDF控制作业,则当您从UI或CLI停止作业时,SCDF将向正在运行的作业发送停止请求。然后,SpringBatch将在获得控件后立即停止作业(在块边界处,如所述)。因此,您看到的是正常的行为:不要期望点击停止按钮,看到jvm立即停止。信息日志消息(
检测到的作业中断状态
)表明作业已正确接收到停止信号,并正在尝试正常停止。因此,停止作业后,它仍然完成当前步骤,只是不执行后续步骤(当它恢复控制时)?这就是你的意思吗?我可能不希望停止jvm。我正在寻找的是当我的Spring批处理收到来自SCDF的停止请求时停止(或更改流,或立即检测来自SCDF的请求)的一些方法。例如,我的ItemWriter可以发送12 3 4…n封邮件。但我使用SCDF在发送第四封邮件时停止作业,第五封邮件之后的下一封邮件将不会发送。这取决于您的区块大小。在您的示例中,如果chunkSize=5,则该步骤将检查是否在处理项目[1,2,3,4,5]之后而不是在第4个项目之后被要求停止。区块处理的思想是将每个区块作为事务中的一个单元进行处理。
StepInterruptionPolicy
在区块边界处检查,即在每个区块(事务)之前/之后,而不是在每个项目之后的区块中。