Spring批处理管理员如何停止正在运行的作业?

时间:2015-10-22 12:38:31

标签: spring-batch spring-batch-admin

Spring批处理管理员如何从UI停止正在运行的作业。

在春季批量管理员的在线文档中,我已阅读以下内容。

  

"正在执行的作业可以由用户停止(无论是否   是可以发射的)。停止信号通过数据库发送一次   Spring Batch在正在运行作业的任何进程中检测到   作业停止(状态从STOPPING变为STOPPED),不再进一步   处理发生。"

这是否意味着Spring批处理管理UI直接改变了弹簧批处理表中作业的状态?

更新:我尝试在正在运行的作业上执行以下查询。

text/css

以上查询在数据库中得到更新,但春季批次不是用来停止正在运行的作业的。

如果有人试过这个,请在​​这里分享逻辑。

3 个答案:

答案 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的状态。

根据此状态,它会在运行之前验证步骤。

这适用于除块之外的所有情况,因为下一步是在大型处理之后调用的。如果你想在其中实现,你可以实现自己的监听器来检查状态(但它会增加数据库命中)。