2

I'm trying to create a job that will process files that were saved by a previous step.

The job definition looks like:

<bean id="downloadCatalogTasklet" class="DownloadCatalogTasklet" scope="step" />

<bean id="customItemReader" class="CustomItemReader" scope="step"/>

<bean id="itemWriter" class="NoOpItemWriter" scope="step"/>

<bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
        <property name="strict" value="true" />
        <property name="resources" value="file://C:/temp/unzipped/*.txt" />
        <property name="delegate" ref="customItemReader" />
    </bean>

<batch:job id="importCatalog">
   <batch:step id="downloadCatalog">
      <batch:tasklet ref="downloadCatalogTasklet" />
      <batch:next on="COMPLETED" to="processCatalog" />
      <batch:fail on="FAILED"/>
   </batch:step>
   <batch:step id="processCatalog">
      <batch:tasklet>
         <batch:chunk reader="multiResourceReader" writer="itemWriter" commit-interval="1" />
      </batch:tasklet>
   </batch:step>
</batch:job>

The fist step is working fine. The catalog is downloaded and unzipped properly. But, when spring batch tries to execute the step processCatalog, it throws the following error (just):

2016-08-23 09:45:31 ERROR AbstractStep:229 - Encountered an error executing step processCatalog in job importCatalog
java.lang.IllegalArgumentException: Name must be assigned for the sake of defining the execution context keys prefix.
    at org.springframework.util.Assert.hasText(Assert.java:162)
    at org.springframework.batch.item.util.ExecutionContextUserSupport.getKey(ExecutionContextUserSupport.java:59)
    at org.springframework.batch.item.ItemStreamSupport.getExecutionContextKey(ItemStreamSupport.java:71)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.update(AbstractItemCountingItemStreamItemReader.java:183)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    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)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy7.update(Unknown Source)
    at org.springframework.batch.item.file.MultiResourceItemReader.update(MultiResourceItemReader.java:209)

This is the first time that I use MultiResourceItemReader. I dont't know if I'm missing something. I'm using spring-batch 3.0.7, with java 1.7.

It seems that I should assign a name to the ExecutionContext, but I don't know how to do it.

Bob Rivers
  • 5,261
  • 6
  • 47
  • 59

1 Answers1

7

You need to specify a name in your configuration for your ItemReaders so that the values within the ExecutionContext can be prefixed and therefore unique per reader. Configure your readers as follows and they should work:

<bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
      <property name="name" value="myMultiResourceItemReader"/>
      <property name="strict" value="true" />
      <property name="resources" value="file://C:/temp/unzipped/*.txt" />
      <property name="delegate" ref="customItemReader" />
</bean>
Michael Minella
  • 20,843
  • 4
  • 55
  • 67