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

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

在spring batch admin的在线文档中,我已阅读以下内容 .

“正在执行的作业可以由用户停止(无论是否可以启动) . 停止信号通过数据库发送,一旦Spring Batch检测到正在运行作业的任何进程,作业就会停止(状态)从STOPPING移动到STOPPED)并且不再进行进一步的处理 . “

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

UPDATE: 我尝试在正在运行的作业上执行以下查询 .

update batch_job_execution set status="STOPPED" where job_ins
tance_id=19;

上面的查询在数据库中得到更新,但是 Spring 季批处理并不是要阻止正在运行的作业 .

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

回答(3)

2 years ago

您在批处理状态与退出状态之间感到困惑 . 您正在使用该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;
        }

2 years ago

我调查了 spring 批次代码 . 它们似乎更新了BATCH_JOB_EXECUTION的版本和状态 .

这对我有用:

update batch_job_execution set status="STOPPED", version=version+1 where job_instance_id=19;

2 years ago

如果您查看spring批处理管理器的jar,您可以在AbstractStep.java(spring-batch管理类)中看到它从数据库检查Step和Job的状态 .

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

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