Java Spring批处理作业步骤示例

Java Spring批处理作业步骤示例,java,spring,parallel-processing,spring-batch,Java,Spring,Parallel Processing,Spring Batch,我试图在spring batch中并行运行多个作业。在google中进行大量搜索后,我遇到了JobStep。是否有人使用过JobStep可以解释如何使用它并行运行作业,或者是否有其他方法并行运行两个独立作业,即当我启动批次时,2个作业应该开始并行运行 .我的要求是 <batch:job id="JobA" incrementer="runIdIncrementer"> <batch:step id="abc"> &

我试图在spring batch中并行运行多个作业。在google中进行大量搜索后,我遇到了JobStep。是否有人使用过JobStep可以解释如何使用它并行运行作业,或者是否有其他方法并行运行两个独立作业,即当我启动批次时,2个作业应该开始并行运行 .我的要求是

 <batch:job id="JobA" incrementer="runIdIncrementer">
            <batch:step id="abc">
                <batch:tasklet transaction-manager="transactionManager">
                    <batch:chunk reader="ReaderA" writer="WriterA" processor="ProcessorA" />
                </batch:tasklet>
          </batch:step>
    </batch:job>

    <batch:job id="JobB" incrementer="runIdIncrementer">
            <batch:step id="def">
                <batch:tasklet transaction-manager="transactionManager">
                    <batch:chunk reader="ReaderB" writer="WriterB" processor="ProcessorB" />
                </batch:tasklet>
          </batch:step>
    </batch:job>
<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

当我的应用程序启动时,两个作业都应该开始运行。是否可以使用spring批处理来执行此操作

<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>
编辑:我甚至试过这种方法

<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

我面临着一个例外 org.springframework.beans.factory.nouniquebeandDefinitionException:未定义[org.springframework.batch.core.Job]类型的合格bean:应为单个匹配bean,但找到了3个:ParallelJob、JobA、JobB。我正在使用commandLineJobRunner启动作业,并传递jobId asParallelJob定义:

<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>
<batch:job id="globalJob">
<batch:split id="StepOne">
    <batch:flow>
    <batch:step id="step1" >
        <batch:job ref="jobRef1"/>
    </batch:step>

    </batch:flow>
    <batch:flow>
    <batch:step id="step2">
        <batch:job ref="jobRef2"/>
    </batch:step>
    </batch:flow>
</batch:split>
</batch:job>
}

<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>
在应用程序启动后执行作业只需设置属性:

<batch:job id="ParallelJob" incrementer="runIdIncrementer" restartable="true">
            <batch:split id="parallelprocessing" task-executor="taskExecutor">
                <batch:flow>
                    <batch:step id="ParallelJob.step1" >
                            <batch:job ref="JobA" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
                <batch:flow>
                    <batch:step id="ParallelJob.step2" >
                            <batch:job ref="JobB" job-launcher="jobLauncher" job-parameters-extractor="jobParametersExtractor"/>
                    </batch:step>       
                </batch:flow>
            </batch:split>
        </batch:job> 


<batch:job id="JobA" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>

<batch:job id="JobB" restartable="true">
        <batch:step id="abc">
            <batch:tasklet >
                <batch:chunk reader="reader" writer="writer" processor="processor"  />
            </batch:tasklet>
      </batch:step>

    </batch:job>
spring.batch.job.names=globalJob

您是否希望能够作为作业的一部分同时执行这两个作业?还是在应用程序启动后立即启动这两个作业?或者你想以任意方式同时执行这两个作业?我已经编辑了我的问题,你能检查@damianI just test your config吗?我看到的唯一问题是批处理步骤不能具有相同的id:,将第二个步骤更改为类似。步骤不能有相同的id,即使它们在不同的工作中。我已经解决了这个问题。这个问题是由不再使用的类引起的。@damain谢谢