Spring批处理作业应用程序与步骤分区

时间:2016-05-06 00:00:45

标签: java spring multithreading spring-batch

我们的应用程序是使用螺纹尺寸为4的弹簧批处理步骤分区实现的。 这意味着我们的步骤在4个线程中读取8百万条记录,每个线程读取200万条记录。线程在某些代码点基本上在应用程序代码中的最后一次调用等待超过预期大约40分钟而不是5到10分钟。

out步骤配置如下(仅样本)。所有4个线程都已启动但方法语句/行的某些部分(例如:println stmts)甚至在条件满足时甚至没有执行。

如果我在步骤分区配置中遗漏了任何内容,请在下面提出几个问题并需要帮助。

1)我是否需要明确标记同步或我们不需要的方法?目前我们只是在Java类中编写java方法(状态较少,即除了类中注入的bean引用之外没有共享的字段值)。

2)如果我需要让我在春季批次中使用的所有业务方法都必须为步骤分区同步,那么最好的方法是什么。

<!-- partitioner job -->
  <job id="partitionJob" xmlns="http://www.springframework.org/schema/batch">

    <!-- master step, 10 threads (grid-size)  -->
    <step id="masterStep">
    <partition step="slave" partitioner="rangePartitioner">
        <handler grid-size="10" task-executor="taskExecutor" />
    </partition>
    </step>

  </job>

  <!-- each thread will run this job, with different stepExecutionContext values. -->
  <step id="slave" xmlns="http://www.springframework.org/schema/batch">
    <tasklet>
        <chunk reader="pagingItemReader" writer="flatFileItemWriter"
            processor="itemProcessor" commit-interval="1" />
    </tasklet>
  </step>

  <bean id="rangePartitioner" class="com.mkyong.partition.RangePartitioner" />

  <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

  <!-- inject stepExecutionContext -->
  <bean id="itemProcessor" class="com.mkyong.processor.UserProcessor" scope="step">
    <property name="threadName" value="#{stepExecutionContext[name]}" />
  </bean>

1 个答案:

答案 0 :(得分:0)

根据@MichaelMinella的评论,此问题已解决。我不必在分区方法上同步。

我的批次被删除的原因是由于存储过程问题,与Spring批次无关