Spring batch spring批处理中多线程进程中的ReaderNotOpenException
我尝试在下面的步骤中使用多线程,但出现以下异常:Spring batch spring批处理中多线程进程中的ReaderNotOpenException,spring-batch,Spring Batch,我尝试在下面的步骤中使用多线程,但出现以下异常: <bean id="outputFileWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step"> <property name="delegates">
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
我的步骤:
代码:
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
例外情况如下:
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
org.springframework.batch.item.ReaderNotOpenException:Reader must be open before it can be read.:org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read.
at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:195)
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
在实现SynchronizeEditemStreamReader异常后:
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
org.springframework.batch.item.ReaderNotOpenException:Reader must be open before it can be read.:org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read.
at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:195)
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
org.springframework.batch.item.ReaderNotOpenException:必须先打开读卡器才能读取。示例:org.springframework.batch.item.ReaderNotOpenException:读卡器必须先打开才能读取。
位于org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:195)
位于org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173)
位于org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
at.synchronizeEditemStreamReader.read(synchronizeEditemStreamReader.java:35)
位于org.springframework.batch.item.file.MultiResourceItemReader.readFromDelegate(MultiResourceItemReader.java:140)
位于org.springframework.batch.item.file.MultiResourceItemReader.readNextItem(MultiResourceItemReader.java:119)
位于org.springframework.batch.item.file.MultiResourceItemReader.read(MultiResourceItemReader.java:108)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:150)上
位于org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:132)
位于org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:120)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
位于com.sun.proxy.$Proxy47.read(未知来源)
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
增加了读写器步骤
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
我是不是遗漏了什么
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
非常感谢您的帮助
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>
谢谢 AbstractItemCountingItemStreamItemReader实现不是线程安全的。您可以尝试通过实现您自己的读卡器和同步方法来解决此问题,这些方法可以改变共享状态,如close()、open()和update()。也显示您的读卡器和写卡器bean。添加了读卡器和写卡器bean。Marcus-我尝试创建自定义读卡器类并添加了同步方法。问题仍然存在。您是否尝试将读取器包装到SynchronizeEditemStreamReader中?是的,已将包装器读取器添加到SynchronizeEditemStreamReader中。还是同一个问题。添加了包装器读取器类供您参考。如果我在SynchronizeEditemStreamReader impl中做了什么错误,请纠正我?@HansjoergWingeier-将包装器读取器添加到SynchronizeEditemStreamReader中。还是同一个问题。添加了包装器读取器类供您参考。如果我在SynchronizeEditemStreamReader impl中做了任何错误,请纠正我。您可以注册您的“”,但我想,您应该注册您的文件读取器,resp。已包装的文件读取器“”。
<bean id="outputFileWriter"
class="org.springframework.batch.item.support.CompositeItemWriter"
scope="step">
<property name="delegates">
<list>
<ref bean="routeWriter" />
</list>
</property>
</bean>
<bean id="routeWriter"
class="com.services.extractor.processor.IngestionWriter"
scope="step">
</bean>