【发布时间】:2015-03-24 15:21:45
【问题描述】:
我正在使用 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。
我的配置有什么问题吗?也许我需要任何额外的配置才能让跳过逻辑工作?
非常感谢任何帮助。谢谢
【问题讨论】:
-
我认为这不是因为跳过逻辑,而是因为它是多线程的。尝试 HibernatePagingItemReader,或者如果您不能使用 Hibernate,请尝试编写 ItemReader 的线程安全实现。
-
@SamwiseGamgee,感谢您的建议。 Bean myItemReader 是
JdbcPagingItemReader阅读器,具有scope=step和saveState=false。因为它似乎不是线程安全的,所以我测试了一个简单的自定义 ItemReader 和synchronized读取方法,它在 myItemReader 中进行委托,但它没有工作。那么,我能做些什么来制作一个线程安全的阅读器呢?或者我该怎么做才能使 myItemReader 成为线程安全的?非常感谢。 -
你在使用休眠吗?
-
forum.spring.io/forum/spring-projects/batch/… 这个链接解释了如何实现线程安全。
-
不,我没有使用 Hibernate
标签: java spring spring-batch