12.6 Running a job
执行基于 JSR-352 作业的入口是 javax.batch.operations.JobOperator
. Spring Batch 提供了这个接口的实现 (org.springframework.batch.core.jsr.launch.JsrJobOperator
). 通过 javax.batch.runtime.BatchRuntime
来实现加载. 使用方法如下所示:
JobOperator jobOperator = BatchRuntime.getJobOperator();
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)
。