|
当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2! |
配置 JobOperator
JobOperator 接口最基础的实现是 TaskExecutorJobOperator。
它只需要一个依赖:JobRepository。其他依赖如 JobRegistry、
MeterRegistry、TransactionManager 等都是可选的。Spring Batch 提供了一个工厂 bean
来简化该操作器的配置:JobOperatorFactoryBean。这个工厂 bean 会在
TaskExecutorJobOperator 外围创建一个事务代理,以确保其所有公共方法都在事务中执行。
-
Java
-
XML
下面的示例展示了如何在 Java 中配置 TaskExecutorJobOperator:
...
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setJobRepository(jobRepository);
return jobOperatorFactoryBean;
}
...
下面的示例展示了如何在 XML 中配置 TaskExecutorJobOperator:
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
<property name="jobRepository" ref="jobRepository" />
</bean>
一旦获得了 JobExecution,它就会被传递给 Job 的
`execute` 方法,最终再将 JobExecution 返回给调用方,如下图所示:
这一流程非常直接,在由调度器触发时工作良好。不过,当你尝试从 HTTP 请求中启动作业时,
问题就会出现。在这种场景下,启动过程需要异步执行,这样 TaskExecutorJobOperator 才能立即返回给调用方。
原因在于,让一个 HTTP 请求长时间保持打开状态以等待长时间运行的进程(例如批处理作业)完成,并不是一种好的实践。
下图展示了一个示例流程:
你可以通过为 TaskExecutorJobOperator 配置一个 TaskExecutor,来支持这种场景。
-
Java
-
XML
下面的 Java 示例将 TaskExecutorJobOperator 配置为立即返回:
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setJobRepository(jobRepository);
jobOperatorFactoryBean.setTaskExecutor(new SimpleAsyncTaskExecutor());
return jobOperatorFactoryBean;
}
下面的 XML 示例将 TaskExecutorJobOperator 配置为立即返回:
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
</property>
</bean>
你可以使用 Spring TaskExecutor 接口的任意实现,
来控制作业异步执行的方式。