Spring批处理管理员如何从UI停止正在运行的作业。
在春季批量管理员的在线文档中,我已阅读以下内容。
"正在执行的作业可以由用户停止(无论是否 是可以发射的)。停止信号通过数据库发送一次 Spring Batch在正在运行作业的任何进程中检测到 作业停止(状态从STOPPING变为STOPPED),不再进一步 处理发生。"
这是否意味着Spring批处理管理UI直接改变了弹簧批处理表中作业的状态?
更新:我尝试在正在运行的作业上执行以下查询。
text/css
以上查询在数据库中得到更新,但春季批次不是用来停止正在运行的作业的。
如果有人试过这个,请在这里分享逻辑。
答案 0 :(得分:1)
您在批量状态与退出状态之间感到困惑。 您正在使用该SQL做什么将STATUS更改为STOPPED
当作业正在运行时,您可以从代码中停止作业。在每个步骤迭代中,检查它们的状态以及是否停止其设置,然后发送步骤以停止正在进行。 无论如何,你所做的并不优雅。 Common Batch Patterns -> 11.2 Stopping a Job Manually for Business Reasons
中解释了正确的方法public class FooProcessor implements ItemProcessor<FooIn,FooOut>{
public FooOut process(FooIn foo) throws Exception {
if (sendToStop(item)) {
throw new MyStopException("I need to Stop: " + item);
}
//do my stuff
return new FooOut(foo);
}
}
停止块步骤的另一种简单方法是在阅读器中返回null。这告诉我们没有更多元素来迭代读者
public T read() throws Exception {
T item = delegate.read();
if (ifNeedStop(item)) {
return null; // end the step here
}
return item;
}
答案 1 :(得分:0)
我调查了弹簧批次代码。 它们似乎更新了BATCH_JOB_EXECUTION的版本和状态。
这对我有用:
update batch_job_execution set status="STOPPED", version=version+1 where job_instance_id=19;
答案 2 :(得分:0)
如果你查看spring批处理管理员的jar,你可以看到它在AbstractStep.java(spring-batch admin class)中检查数据库中Step和Job的状态。
根据此状态,它会在运行之前验证步骤。
这适用于除块之外的所有情况,因为下一步是在大型处理之后调用的。如果你想在其中实现,你可以实现自己的监听器来检查状态(但它会增加数据库命中)。