当我使用“拆分流”并行运行 spring 批处理作业时,我发现 spring 批处理管理和命令行之间存在差异。
我的工作流程如下:
Job1 -> Job2 -> Job3
-> Job4
当我从 Spring Batch admin 运行这些作业时,“Job1”可以同时启动“Job2”和“Job4”,然后“Job2”可以启动“Job3”。
此外,在“step1”完成后,“Job1”完成。然后“Job2”和“Job4”并行继续它们的过程。
“Job1”不等待“Job2”和“Job4”完成。
spring batch admin的app-context.xml和Job配置如下:
Job1.xml
<import resource="classpath*:META-INF/spring/batch/dependencies/parallel2.xml"/>
<import resource="classpath*:META-INF/spring/batch/dependencies/parallel3.xml"/>
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
<bean id="simpleJobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor" ref="taskExecutor" />
</bean>
<bean id="job1.stp01" class="com.jobs.Job1Step1" />
<batch:job id="Job1" restartable="true" >
<batch:step id="step1" next="split">
<batch:tasklet ref="job1.stp01" />
</batch:step>
<batch:split id="split" next="step3">
<batch:flow>
<batch:step id="flow1" >
<batch:job ref="Job2" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="flow2">
<batch:job ref="Job3" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
应用程序上下文.xml
<batch:job-repository id="jobRepository" />
<task:executor id="jobLauncherTaskExecutor" pool-size="10" rejection-policy="ABORT"/>
<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry"/>
</bean>
但在命令行中,与 spring batch admin 有一些区别。
app-context.xml 和命令行的作业配置如下:
Job1.xml
<import resource="app-context.xml" />
<import resource="parallel2.xml"/>
<import resource="parallel3.xml"/>
<bean id="job1.stp01" class="com.jobs.Job1Step1" />
<batch:job id="Job1" restartable="true" >
<batch:step id="step1" next="split">
<batch:tasklet ref="job1.stp01" />
</batch:step>
<batch:split id="split" task-executor="jobLauncherTaskExecutor" next="step3">
<batch:flow>
<batch:step id="flow1" >
<batch:job ref="Job2" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="flow2">
<batch:job ref="Job3" job-launcher="simpleJobLauncher"/>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
应用程序上下文.xml
<bean id="springBatchDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
.......
</bean>
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="databaseType" value="POSTGRES" />
<property name="dataSource" ref="springBatchDataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="simpleJobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="jobLauncherTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
当我从命令行运行作业时,“Job1”可以同时启动“Job2”和“Job4”,然后“Job2”可以启动“Job3”。
问题是
虽然“step1”已经完成,但“Job1”的状态仍然是“Unknown”。只有在“Job2”和“Job4”完成后,状态才会变为“Completed”。
“Job1”正在等待“Job2”和“Job4”完成。
但是在春季批处理管理中,“Job1”不会等待“Job2”和“Job4”。一旦“step1”完成,“Job1”的状态就会变为“Completed”。
我不希望“Job1”在命令行中等待“Job2”和“Job4”。
有没有办法这样做???
附言。很抱歉,问题很长,感谢您的帮助。