我正在使用Spring 4.0.5和Spring Batch 3.0.1
我有一个简单的步骤,它很完美:
<step id="myStep" next="nextStep">
<tasklet transaction-manager="myTxManager" task-executor="myTaskExecutor" throttle-limit="10">
<batch:chunk reader="myItemReader" processor="myPDFItemProcessor" writer="myItemWriter" commit-interval="20">
</batch:chunk>
</tasklet>
</step>
我已经尝试过一个简单的跳过限制示例(Configuring Skip Logic),如下所示:
<step id="myStep" next="nextStep">
<tasklet transaction-manager="myTxManager" task-executor="myTaskExecutor" throttle-limit="10">
<batch:chunk reader="myItemReader" processor="myPDFItemProcessor" writer="myItemWriter" commit-interval="20" skip-limit="10000000">
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception" />
</batch:skippable-exception-classes>
</batch:chunk>
</tasklet>
</step>
当我尝试添加此逻辑时,此警告会写在日志文件中:
2015-03-24 16:03:50 [WARN ] [org.springframework.batch.core.step.builder.FaultTolerantStepBuilder.detectStreamInReader(FaultTolerantStepBuilder.java:504)] Asynchronous TaskExecutor detected with ItemStream reader. This is probably an error, and may lead to incorrect restart data being stored.
2015-03-24 16:04:18 [WARN ] [org.springframework.batch.core.step.item.ChunkMonitor.open(ChunkMonitor.java:118)] No ItemReader set (must be concurrent step), so ignoring offset data.
2015-03-24 16:04:18 [WARN ] [org.springframework.batch.core.step.item.ChunkMonitor.getData(ChunkMonitor.java:155)] ItemStream was opened in a different thread. Restart data could be compromised.
该阅读器是JdbcPagingItemReader,其saveState设置为false。
处理器是CompositeItemProcessor。
编写者是CompositeItemWriter。
我的配置有什么问题吗?也许我需要任何其他配置才能使跳跃逻辑起作用?
任何帮助都非常感谢。谢谢
最佳答案
最后,我可以用Samwise的提示解决问题。
当您在多线程步骤中拥有一个ItemReader时,为了使该读取器线程安全,代码为:
public SynchronizedItemReader<T> implements ItemReader<T> {
private final ItemReader<T> delegate;
public SynchronizedItemReader(ItemReader<T> delegate) {
this.delegate = delegate;
}
public synchronized T read () {
return delegate.read();
}
}
此类中的委托ItemReader是您要使其成为线程安全的当前ItemReader。
该示例类在Samwise建议的链接中。
重要编辑:Item Readers and Writers第6.5节中的文档说明必须将委托阅读器作为流注入。我不知道为什么,但是在我这个问题的当前问题中,不能将委托读取器作为流读取器注入到块中。当我注入它时,它失败了。
希望对您有所帮助。
谢谢。