当前位置: 首页 > 知识库问答 >
问题:

Spring Batch:并行运行作业时Spring Batch admin和命令行的区别

姚雅珺
2023-03-14

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

我有一个工作流如下:

Job1 -> Job2 -> Job3  
     -> Job4
<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>

app-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 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>

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" />

我很抱歉,因为我的问题太久了,谢谢你的帮助。

共有1个答案

封俊艾
2023-03-14

此场景的正确行为是,在这两种情况下,在Job2和Job4完成之前,不应将Job1标记为completed。如果在其中一个场景中没有发生这种情况,这就是一个bug,应该记录在Jira(https://Jira.spring.io)中。当Job1标记为complete时,您确定Spring Batch Admin中的其他作业没有完成吗?

 类似资料:
  • 我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据

  • 我有这个命令来编译我的程序。 我创建了以下makefile。 如果从terminal运行该命令将成功,但make将失败。 它将失败,并出现错误 该文件应该在命令中使用导入。 我认为Makefile中的命令执行起来很像bash脚本。 在bash中运行命令和在Makefile中运行命令有什么区别?

  • 我使用Java Jersey框架(与Maven一起使用),并使用IntelliJ作为IDE。我遇到过这个运行时异常,它只发生在尝试从命令行运行代码时(使用maven编译,然后使用Java-JAR),但在IntelliJ中运行时不会发生,这很奇怪。 我有一些Java代码,它将尝试使HTTP访问某个远程URL,并尝试将返回的JSON读入某个Lombok POJO: 正如我之前提到的,奇怪的是,只有当我

  • 问题内容: 我想从命令行运行Zend Framework操作来生成一些文件。这可能吗?我需要对使用ZF的现有Web项目进行多少更改? 谢谢! 问题答案: 实际上,它比您想象的要容易得多。引导程序/应用程序组件和您现有的配置可以与CLI脚本一起重用,同时避免了MVC堆栈和HTTP请求中调用的不必要的重量。这是不使用wget的优点之一。 按照您的公共index.php启动脚本: 然后,您可以像在MVC

  • 问题内容: 作业系统:Cent-OS 我有一些作业(或脚本)要运行。每个工作需要3-5分钟。我有。我可以并行使用。请建议一些脚本或工具通过并行运行40个Jobs来处理30,000个Job。 我做了什么: 我创建了40个不同的文件夹,并通过为每个目录创建一个Shell脚本来并行执行作业。 我想知道下一次处理此类工作的更好方法。 问题答案: 正如Mark Setchell所说:GNU并行。 如果您坚持

  • 一个spark有一个oracle查询。所以我必须并行运行多个作业,以便所有查询都将同时激发。 如何并行运行多个作业?