无法配置Spring Batch以运行作业

时间:2015-05-14 04:01:18

标签: java spring spring-batch batch-processing

我使用以下作业启动器来启动我的弹簧批处理作业:

  <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository"/>
    <property name="taskExecutor">
      <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
    </property>
  </bean>

我的工作定义是

  <job id="bulkExportJob" restartable="false" xmlns="http://www.springframework.org/schema/batch">
    <description>Exports an application to pdf in a bulk operation</description>

    <step id="startExport" next="exportFileTree">
      <description>Do something to start the export</description>
      <tasklet ref="startBulkActionTasklet"/>
    </step>

    <step id="exportFileTree" next="zipFileTree">
      <description>Export the application</description>
      <tasklet>
        <chunk reader="bulkActionTargetReader" writer="bulkExportFileTreeWriter" commit-interval="1" skip-limit="100000000">
          <skippable-exception-classes>
            <!-- Exceptions are handled internally to the Writer so exception should not be treated as failures -->
            <include class="java.lang.Exception"/>
          </skippable-exception-classes>
        </chunk>
      </tasklet>
      <listeners>
        <listener ref="promotionListener"/>
      </listeners>
    </step>

    <step id="zipFileTree" next="sendEmail">
      <description>Creates a zip file</description>
      <tasklet ref="bulkExportZipWriter"/>
    </step>

    <step id="sendEmail" next="finishExport">
      <description>Send notification email</description>
      <tasklet ref="bulkExportSendNotification"/>
    </step>


    <step id="finishExport">
      <description>Finalise the export</description>
      <tasklet ref="finishBulkActionTasklet"/>
    </step>

  </job>

我的目的是一次运行一个作业并排队所有其他传入的作业。但是从日志文件中我可以看到所有作业并行运行。正如您从代码片段中看到的那样,我没有任何其他代码可以并行生成spring批处理,但它仍然可以。你能指出我做错了吗?

2 个答案:

答案 0 :(得分:2)

您正在使用正在运行作业异步的SimpleAsyncTaskExecutor并为每个作业创建新线程:

  

TaskExecutor实现,为每个任务激活一个新线程,   异步执行它。

     

支持通过“concurrencyLimit”限制并发线程   豆类财产。默认情况下,并发线程数为   无限制。

     

注意:此实现不会重用线程!考虑一下   相反,线程池TaskExecutor实现,尤其适用于   执行大量短期任务。

根据建议,如果您绝对需要SimpleAsyncTaskExecutor,则可以将concurrencyLimit设置为1(具有throttle-limit="1"属性)并且一次有1个作业,但是您可以使用默认{{1}这将按顺序运行作业,当一个完成时将运行其他作业(根据您想要的解释进行猜测)。

答案 1 :(得分:1)

尝试将throttle-limit="1"添加到tasklet定义中。 http://docs.spring.io/spring-batch/trunk/reference/html/scalability.html处的文档表明默认为4。