Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring批处理:添加跳过限制时taskExecutor异常_Java_Spring_Spring Batch - Fatal编程技术网

Java Spring批处理:添加跳过限制时taskExecutor异常

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

我使用的是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" 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();
  }
}