我已经为一个步骤实现了弹簧批处理分区,其中主步骤将其工作委托给多个并行执行的从属线程。如下图所示。(参考Spring docs)
现在如果我有多个并行执行的步骤怎么办?如何在批量配置中配置它们?我目前的配置是
<batch:job id="myJob" restartable="true" job-repository="jobRepository" >
<batch:listeners>
<batch:listener ref="myJoblistener"></batch:listener>
</batch:listeners>
<batch:step id="my-master-step">
<batch:partition step="my-step" partitioner="my-step-partitioner" handler="my-partitioner-handler">
</batch:partition>
</batch:step>
</batch:job>
<batch:step id="my-step" >
<batch:tasklet ref="myTasklet" transaction-manager="transactionManager" >
</batch:tasklet>
<batch:listeners>
<batch:listener ref="myStepListener"></batch:listener>
</batch:listeners>
</batch:step>
我的架构图应该如下图所示:
即使有可能使用弹簧批,我也不确定。任何想法或我都在实现它。谢谢。
答案 0 :(得分:3)
您可以尝试以下操作。
<batch:job id="myJob" restartable="true" job-repository="jobRepository" >
<batch:listeners>
<batch:listener ref="myJoblistener"></batch:listener>
</batch:listeners>
<batch:step id="my-master-step">
<batch:partition step="my-step" partitioner="my-step-partitioner" handler="my-partitioner-handler">
</batch:partition>
</batch:step>
</batch:job>
<batch:step id="my-step" >
<batch:job ref="MyChildJob" job-launcher="jobLauncher"
job-parameters-extractor="jobParametersExtractor" />
<batch:listeners>
<batch:listener ref="myStepListener"></batch:listener>
</batch:listeners>
</batch:step>
<batch:job id="MyChildJob" restartable="false"
xmlns="http://www.springframework.org/schema/batch">
<batch:step id="MyChildStep1" next="MyChildStep2">
<batch:tasklet ref="MyChildStep1Tasklet" transaction-manager="transactionManager" >
</batch:tasklet>
</batch:step>
<batch:step id="MyChildStep2" next="MyChildStep3">
<batch:tasklet ref="MyChildStep2Tasklet" transaction-manager="transactionManager" >
</batch:tasklet>
</batch:step>
<batch:step id="MyChildStep3">
<batch:tasklet ref="MyChildStep3Tasklet" transaction-manager="transactionManager" >
</batch:tasklet>
</batch:step>
</batch:job>
答案 1 :(得分:0)
我有类似的要求,并使用以下要求解决了它
<batch:job id="cycleJob">
<batch:step id="zStep" next="gStep">
<batch:partition partitioner="zPartitioner">
<batch:step>
<batch:tasklet throttle-limit="1">
<batch:chunk processor="itemProcessor" reader="zReader" writer="itemWriter" commit-interval="1">
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:handler task-executor="taskExecutor" grid-size="${maxThreads}" />
</batch:partition>
</batch:step>
<batch:step id="gStep" parent="zStep" next="yStep">
<batch:partition partitioner="gPartitioner">
<batch:step>
<batch:tasklet throttle-limit="1">
<batch:chunk processor="itemProcessor" reader="gReader" writer="itemWriter" commit-interval="1">
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:handler task-executor="taskExecutor" grid-size="${maxThreads}" />
</batch:partition>
</batch:step>
</batch:job>
答案 2 :(得分:0)
最新答案,但是我终于找到了我最初来这里寻找的解决方案,它使用了一个流程而不是一个子工作。所以我想也应该在这里发布。
<job id="myJob">
<step id="my-master-step">
<partition partitioner="my-step-partitioner">
<handler task-executor="my-partitioner-handler" />
<step>
<!-- For each partition, we run the complete flow -->
<flow parent="mainFlow" />
</step>
</partition>
</step>
</job>
<!-- The flow consists of several sequential steps (2 here) -->
<flow id="mainFlow">
<step id="MyChildStep1" next="MyChildStep2">
<!-- Here you can have a tasklet or a chunk of course -->
<tasklet ref="MyChildStep1Tasklet" />
</step>
<step id="MyChildStep2">
<!-- Same here -->
<tasklet ref="MyChildStep2Tasklet" />
</step>
</flow>
<bean id="MyChildStep1Tasklet" class="..." />
<bean id="MyChildStep1Tasklet" class="..." />
我还没有测试过并行运行,但是我看不出为什么它不能正常工作。