Spring batch SpringBatch:作业并行运行时SpringBatch管理和命令行之间的差异

Spring batch SpringBatch:作业并行运行时SpringBatch管理和命令行之间的差异,spring-batch,spring-batch-admin,Spring Batch,Spring Batch Admin,当我使用“分割流”并行运行spring批处理作业时,我发现spring批处理管理和命令行之间存在差异 我的工作流程如下所示: Job1 -> Job2 -> Job3 -> Job4 当我从spring batch admin运行这些作业时,“Job1”可以同时启动“Job2”和“Job4”,然后“Job2”可以启动“Job3” 此外,“作业1”在“步骤1”完成后完成。然后“Job2”和“Job4”并行地继续它们的过程。 “作业1”不会等待“作业2”和“作业4”

当我使用“分割流”并行运行spring批处理作业时,我发现spring批处理管理和命令行之间存在差异

我的工作流程如下所示:

Job1 -> Job2 -> Job3  
     -> Job4
当我从spring batch admin运行这些作业时,“Job1”可以同时启动“Job2”和“Job4”,然后“Job2”可以启动“Job3”

此外,“作业1”在“步骤1”完成后完成。然后“Job2”和“Job4”并行地继续它们的过程。 “作业1”不会等待“作业2”和“作业4”完成

spring batch admin的app-context.xml和作业配置如下所示: Job1.xml

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" />
但在命令行中,与SpringBatch管理有一些不同。 命令行的app-context.xml和作业配置如下: Job1.xml

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”

问题是

虽然“步骤1”已完成,“作业1”的状态仍然为“未知”。只有在“作业2”和“作业4”完成后,状态才会更改为“已完成”。 “作业1”正在等待“作业2”和“作业4”完成

但在spring批处理管理中,“Job1”并不等待“Job2”和“Job4”。“步骤1”完成后,“作业1”的状态立即变为“已完成”

我不希望“Job1”在命令行中等待“Job2”和“Job4”。 有没有办法做到这一点


另外,我很抱歉提出了这么长的问题,感谢您的帮助。

此场景的正确行为是,在这两种情况下,在作业2和作业4完成之前,不应将作业1标记为已完成。如果在其中一个场景中没有发生这种情况,那么这是一个bug,应该记录在Jira中。当Job1标记为完成时,您确定Spring Batch Admin中的其他作业没有完成吗?

我想我找到了原因。这是因为spring batch admin和命令行的上述配置不同。在spring batch admin中,我使用SimpleZoblancher中的taskExecutor使“Job2”和“Job4”并行运行。但在命令行中,尽管我在SimpleZoblancher中使用taskExecutor,但这些作业并不并行运行。它们只按顺序执行。因此,我在分割流中使用taskExecutor,作业并行运行,但正如我在问题中解释的那样,出现了上述情况。当我在“split flow”中使用taskExecutor再次测试spring批处理管理时,它与命令行相同。作业1等待其他作业完成。所以,我想我问错了,我很抱歉。实际上,我应该问的问题是如何使作业在命令行中并发运行。有没有办法在命令行中并行运行作业??
<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>
<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" />