如何在spring-batch中拆分和连接流以配置作业中的设置和拆卸步骤

时间:2016-03-30 19:52:32

标签: java spring multithreading spring-batch

我已经审核了Spring-batch flow / split after a step,发现(a)标记的解决方案没有解析,因为拆分无法访问,而且(b)我的用例不同,所以答案的意图是不同的。 / p>

我还审核了How to configure mentioned use case using spring batch parallel step split flow?,但解决方法是增加并行化,而不是分割和连接线程。

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

我有一个并行化的弹簧批作业,我想添加设置和拆卸步骤。设置和teatdown是单线程的,但主体工作是并行化的。

随着时间的推移,事件的图表不同:

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

我开始的弹簧批处理作业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 个答案:

答案 0 :(得分:0)

该帖子主要概述了解决方案:How to terminate Step within a Spring Batch Split Flow with a Decider

弹簧批作业的最终文本是:

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