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

如何在spring批处理中拆分和连接流,以配置作业中的设置和拆卸步骤

弘思聪
2023-03-14

我在一个步骤后回顾了Spring批处理流/拆分,发现(a)标记的解决方案没有解析,因为拆分无法实现,(b)我的用例不同,因此答案的意图不同。

我还回顾了如何使用spring批处理并行步骤拆分流配置上述用例?,但解决方案是增加并行化,而不是拆分和连接线程。

这似乎是一个足够常见的用例,应该是一个常见问题,但我还没有看到解决方案。

我有一个并行的spring批处理作业,我想在其中添加设置和拆卸步骤。安装和拆卸是单线程的,但主体工作是并行的。

随着时间的推移,以不同的方式绘制事件:

start        setup
               |
split       -------
            |     |
         some    other
         stuff   stuff
            |     |
join        -------
               |
finish      teardown

我从spring批处理作业XML开始:

<batch:job id="myJob">

    <batch:step id="step0001-setup">
        <batch:tasklet transaction-manager="jtaTransactionManager"
            start-limit="100" allow-start-if-complete="true">
            <batch:chunk reader="beforeJobScriptExecutor" writer="dummySinkWriter"
                commit-interval="1" />
        </batch:tasklet>
    </batch:step>


    <batch:split id="split1" task-executor="taskExecutor" next="step9999">

        <batch:flow>
            <batch:step id="step0003-one-thread"
                allow-start-if-complete="true">
                <batch:tasklet transaction-manager="jtaTransactionManager"
                    start-limit="100">
                    <batch:chunk reader="myReader1" writer="myWriter1"
                        commit-interval="1" />
                </batch:tasklet>
            </batch:step>
        </batch:flow>

        <batch:flow>
            <batch:step id="step0002-another-thread">
                <batch:tasklet transaction-manager="jtaTransactionManager"
                    start-limit="100">
                    <batch:chunk reader="myReader2" writer="myWriter2"
                        commit-interval="1" />
                </batch:tasklet>
            </batch:step>
        </batch:flow>

    </batch:split>


    <batch:step id="step9999">
        <batch:tasklet transaction-manager="jtaTransactionManager"
            start-limit="100" allow-start-if-complete="true">
            <batch:chunk reader="afterJobScriptExecutor" writer="dummySinkWriter"
                commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>

共有1个答案

计光赫
2023-03-14

本文主要概述了解决方案:如何使用决策器终止Spring批处理分割流中的步骤

spring批处理作业的最终文本如下:

<batch:job id="myJob">

    <batch:step id="step0001-setup">
        <batch:tasklet transaction-manager="jtaTransactionManager"
            start-limit="100" allow-start-if-complete="true">
            <batch:chunk reader="beforeJobScriptExecutor" writer="dummySinkWriter"
                commit-interval="1" />
        </batch:tasklet>
        <batch:end on="FAILED" />
        <batch:next on="*" to="split1" />
    </batch:step>


    <batch:split id="split1" task-executor="taskExecutor" next="step9999">

        <batch:flow>
            <batch:step id="step0003-one-thread"
                allow-start-if-complete="true">
                <batch:tasklet transaction-manager="jtaTransactionManager"
                    start-limit="100">
                    <batch:chunk reader="myReader1" writer="myWriter1"
                        commit-interval="1" />
                </batch:tasklet>
            </batch:step>
        </batch:flow>

        <batch:flow>
            <batch:step id="step0002-another-thread">
                <batch:tasklet transaction-manager="jtaTransactionManager"
                    start-limit="100">
                    <batch:chunk reader="myReader2" writer="myWriter2"
                        commit-interval="1" />
                </batch:tasklet>
            </batch:step>
        </batch:flow>

    </batch:split>


    <batch:step id="step9999">
        <batch:tasklet transaction-manager="jtaTransactionManager"
            start-limit="100" allow-start-if-complete="true">
            <batch:chunk reader="afterJobScriptExecutor" writer="dummySinkWriter"
                commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>
 类似资料:
  • 当我查看Spring Batch留档以并行执行步骤时,我只看到它通过XML的配置,如下所示。 我正在使用Spring批处理编写一个应用程序,我也使用了Spring Boot,我的所有配置都是使用注释完成的。是否有一个我可以使用Java配置来配置拆分步骤的方法?我查看了Spring Batch中Step interface的API文档,但它没有Split Step的默认实现。有没有办法使用现有的默认

  • 是否可以在Spring批处理中动态配置作业? 这是我想做的。我创建了几个不同的,如下所示: FlatFileItemReader 我希望能够在创建批处理作业时动态混合和匹配它们。例如,假设我需要一个有2个步骤的作业。第一步包含一个用于预处理的。第二步将有一个,用于使用我的阅读器/写入器进行基于块的数据处理......类似这样的东西: 在XML中,我可以执行以下操作: 但是我如何像上面一样以编程方式

  • 但是我只想执行一次,@在场景大纲之前,@在场景大纲之后!在cucumber-JVM中有什么方法可以实现这一点吗?

  • 我希望在我的应用程序中定义多个,并尝试将它们模块化,如下所示: 从sysout中,我可以看到创建了两个作业bean。 那么为什么找不到读者呢?我的意思是:除了将bean方法本身命名为,并将其注入变量名之外,我还能做些什么呢? SideNote:当我删除模块化并在上使用时,job运行良好。所以我很确定作业和阅读器的配置应该是正确的。但是当然我不能在下面运行类似的jobclass,所以我希望启用模块化

  • 当编写器抛出异常时,我希望能够将步骤和作业状态设置为失败。在做了一些调试和检查Spring批处理源代码后,我注意到配置了一个,它认为是一个致命的异常,因此将作业状态设置为FAILED,所以我将代码包装在我的编写器中的一个try-get中,将包装在中,现在作业和步骤状态设置为FAILED,这是我想要的。我不确定这是否是正确的方法,因为我在任何地方都找不到它的文档,的留档也没有提到它。所以,问题是:这

  • Spring docs表示,需要手动为WebClient配置http客户机以设置超时:https://docs.Spring.io/Spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor-timeout。但是,由于WebClient返回反应单声道,所以可以(在AP