Java Spring批处理:添加跳过限制时taskExecutor异常
我使用的是Spring4.0.5和SpringBatch 3.0.1 我有这样一个简单的步骤,它工作得非常完美:Java Spring批处理:添加跳过限制时taskExecutor异常,java,spring,spring-batch,Java,Spring,Spring Batch,我使用的是Spring4.0.5和SpringBatch 3.0.1 我有这样一个简单的步骤,它工作得非常完美: <step id="myStep" next="nextStep"> <tasklet transaction-manager="myTxManager" task-executor="myTaskExecutor" throttle-limit="10"> <batch:chunk reader="myItemReader" p
<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>
读卡器是JdbcPagingItemReader,saveState设置为false
处理器是一个复合处理器
这位作家是一位复合作家
我的配置有什么问题吗?也许我需要任何额外的配置才能使跳过逻辑正常工作
非常感谢您的帮助。谢谢最后,我可以用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();
}
}
公共SynchronizeEditemReader实现ItemReader{
私人最终项目读者代表;
公共SynchronizeEditemReader(ItemReader委托){
this.delegate=委托;
}
公共同步T读取(){
返回delegate.read();
}
}
此类中的委托ItemReader是要使线程安全的当前ItemReader
这个示例类位于Samwise建议的链接中
重要编辑:第6.5节中的文档解释了委托读者必须作为流注入。我不知道为什么,但在我当前的问题中,委托读取器不能作为流读取器注入到块中。当我注射它时,它失败了
希望这会有帮助。
谢谢。我想这不是因为跳过逻辑,而是因为它是多线程的。请尝试HibernatePagingItemReader,如果您不能使用Hibernate,请尝试编写ItemReader的线程安全实现。@SamwiseGamgee,谢谢您的建议。Bean myItemReader是一个
JdbcPagingItemReader
阅读器,具有scope=step
和saveState=false
。由于它似乎不是线程安全的,所以我测试了一个简单的自定义ItemReader,它使用synchronized
读取方法,该方法在myItemReader中进行委托,但它不起作用。那么,我能做些什么来制作线程安全的阅读器呢?或者我可以做些什么使myItemReader成为线程安全的?非常感谢。你正在使用hibernate吗?这个链接解释了如何实现线程安全。不,我没有使用Hibernate。这对我来说不起作用。投诉org.springframework.batch.item.ReaderNotOpenException:必须先打开读卡器才能读取。
@dbreaux,尝试在区块配置中“作为流注入”。
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.
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();
}
}