配置 JobOperator

JobOperator 接口最基本的实现是 TaskExecutorJobOperator。它只需要一个依赖:一个 JobRepository。所有其他依赖,如 JobRegistryMeterRegistryTransactionManager 等都是可选的。Spring Batch 提供了一个工厂 bean 来简化这个操作符的配置:JobOperatorFactoryBean。这个工厂 bean 在 TaskExecutorJobOperator 周围创建一个事务代理,以确保其所有公共方法都在事务中执行。

  • Java

  • XML

以下示例展示了如何在 Java 中配置 TaskExecutorJobOperator

Java 配置
...
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
	JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
	jobOperator.setJobRepository(jobRepository);
	return jobOperatorFactoryBean;
}
...

以下示例展示了如何在 XML 中配置 TaskExecutorJobOperator

XML 配置
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
    <property name="jobRepository" ref="jobRepository" />
</bean>

一旦获取到 JobExecution,它就会传递给 Job 的 execute 方法,最终将 JobExecution 返回给调用者,如下图所示

Job Launcher Sequence
图 1. 任务启动器序列

当从调度器启动时,此序列简单且运行良好。但是,当尝试从 HTTP 请求启动时会出现问题。在这种情况下,启动需要异步完成,以便 TaskExecutorJobOperator 立即返回给其调用者。这是因为将 HTTP 请求长时间保持打开以完成长时间运行的进程(例如批处理作业)不是一个好的做法。下图显示了一个示例序列

Async Job Launcher Sequence
图 2. 异步任务启动器序列

您可以通过配置 TaskExecutor 来配置 TaskExecutorJobOperator 以允许此场景。

  • Java

  • XML

以下 Java 示例配置 TaskExecutorJobOperator 以立即返回

Java 配置
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
	JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
	jobOperator.setJobRepository(jobRepository);
	jobOperator.setTaskExecutor(new SimpleAsyncTaskExecutor());
	return jobOperatorFactoryBean;
}

以下 XML 示例配置 TaskExecutorJobOperator 以立即返回

XML 配置
<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 接口的任何实现来控制作业如何异步执行。

© . This site is unofficial and not affiliated with VMware.