Spring 批处理作业应用程序因步骤分区而挂起
Spring batch job application hangs with step partition
我们的应用程序是使用线程大小为 4 的 spring 批处理步骤分区实现的。
这意味着我们的步骤在 4 个线程中读取 800 万条记录,每个线程读取 200 万条记录。线程在代码的某个点基本上是应用程序代码中的最后一次调用等待的时间比预期的要长,大约 40 分钟而不是 5 到 10 分钟。
步配置如下(仅示例)。所有 4 个线程都已启动,但方法 statements/lines 的某些部分(例如:println stmts)甚至没有执行,尽管条件满足。
下面有几个问题,如果我在步骤分区配置中遗漏了任何内容,需要帮助。
1) 我需要显式标记方法同步还是不需要?目前我们只是在 Java class 中编写了 java 方法(state less ,即没有字段class).
中除了注入的 bean 引用之外共享的值
2) 如果我需要使我在 spring 批处理中使用的所有业务方法都必须同步到步骤分区,最好的方法是什么。
<!-- 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>
这已根据@MichaelMinella 的评论解决。我不必同步分区方法。
我的批次被击中的原因是存储过程问题,与spring批次
无关
我们的应用程序是使用线程大小为 4 的 spring 批处理步骤分区实现的。 这意味着我们的步骤在 4 个线程中读取 800 万条记录,每个线程读取 200 万条记录。线程在代码的某个点基本上是应用程序代码中的最后一次调用等待的时间比预期的要长,大约 40 分钟而不是 5 到 10 分钟。
步配置如下(仅示例)。所有 4 个线程都已启动,但方法 statements/lines 的某些部分(例如:println stmts)甚至没有执行,尽管条件满足。
下面有几个问题,如果我在步骤分区配置中遗漏了任何内容,需要帮助。
1) 我需要显式标记方法同步还是不需要?目前我们只是在 Java class 中编写了 java 方法(state less ,即没有字段class).
中除了注入的 bean 引用之外共享的值2) 如果我需要使我在 spring 批处理中使用的所有业务方法都必须同步到步骤分区,最好的方法是什么。
<!-- 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>
这已根据@MichaelMinella 的评论解决。我不必同步分区方法。
我的批次被击中的原因是存储过程问题,与spring批次
无关