配置 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();
jobOperator.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 請求長時間保持開啟以完成長時間執行的程序(例如批處理作業)不是一個好的做法。下圖顯示了一個示例序列
您可以透過配置 TaskExecutor 來配置 TaskExecutorJobOperator 以允許此場景。
-
Java
-
XML
以下 Java 示例配置 TaskExecutorJobOperator 以立即返回
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperator.setJobRepository(jobRepository);
jobOperator.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 介面的任何實現來控制作業如何非同步執行。