Spring Batch:当并行运行作业时,Spring批处理管理和命令行之间的差异

时间:2014-08-21 11:45:48

标签: spring-batch spring-batch-admin

当我使用'Split flow'并行运行spring批处理作业时,我发现spring batch admin和命令行之间存在差异。

我的工作流程如下:

Job1 -> Job2 -> Job3  
     -> Job4

当我从spring batch admin运行这些作业时,'Job1'可以启动'Job2'和'Job4',然后'Job2'可以启动'Job3'。

此外,'job1'在'step1'结束后完成。然后'Job2'和'Job4'并行继续他们的流程 'Job1'不等待'Job2'和'Job4'完成。

app-context.xml和spring batch admin的作业配置如下:
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>

应用-context.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批处理管理员存在一些差异 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>

APP-context.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”完成后,状态才会变为“已完成” 'Job1'正在等待'Job2'和'Job4'完成。

但是在春季批处理管理员中,'Job1'不会等待'Job2'和'Job4'。 “step1”的状态在“step1”结束后立即变为“已完成”。

我不希望'Job1'在命令行中等待'Job2'和'Job4' 有办法吗?

聚苯乙烯。我很抱歉,因为长期的问题并感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

此方案的正确行为是,在两种情况下,Job1都不应标记为COMPLETED,直到Job2和Job4完成。如果在其中一个场景中没有发生这种情况,这是一个错误,应该记录在Jira(https://jira.spring.io)中。当Job1标记为COMPLETE时,您确定Spring Batch Admin中的其他作业是否完整?