12.6 Running a job

执行基于 JSR-352 作业的入口是 javax.batch.operations.JobOperator. Spring Batch 提供了这个接口的实现 (org.springframework.batch.core.jsr.launch.JsrJobOperator). 通过 javax.batch.runtime.BatchRuntime 来实现加载. 使用方法如下所示:

  1. JobOperator jobOperator = BatchRuntime.getJobOperator();
  2. long jobExecutionId = jobOperator.start("fooJob", new Properties());

这段代码的含义如下:

  • 引导基本的 ApplicationContext -为了提供批处理功能, 框架需要用到一些基础组件. 在每个JVM中都会执行一次. 这些组件的引导和 @EnableBatchProcessing 很相似. 详细的信息可以参考 JsrJobOperator 的 javadoc 文档.
  • 加载所需的 ApplicationContext - 前面的例子中, 框架回去查找 /META-INF/batch-jobs 中一个叫做 fooJob.xml 的文件, 并加载前面提到的 shared context 的一个子context .
  • 运行 job - 在上下文context中定义的 job 会被异步执行. 但会先返回 JobExecution 的 id.

[Note] Note

所有基于 JSR-352 的批处理作业都是异步执行的.

调用 SimpleJobOperator 的 JobOperator#start 方法时, Spring Batch 会判断这次调用是初始运行还是重试运行。使用基于JSR-352 的 JobOpeator#start(String jobXMLName, Properties jobParameters) , 框架每次都会创建一个新的JobInstance( JSR-352的作业参数不是唯一的[non-identifying])。若重启作业, 需要调用 JobOperator#restart(long executionId, Properties restartParameters)