Spring batch and beanio

520 views
Skip to first unread message

beboner

unread,
Jul 2, 2013, 12:10:32 PM7/2/13
to bea...@googlegroups.com
I try to launch my spring batch with beanio-2.1.0M1 with this setting

  <bean id="writer" class="org.beanio.spring.BeanIOFlatFileItemWriter" scope="step">
    <property name="streamMapping" value="classpath:/mapping/COMPANY/NORM/NORM-IN-mapping.xml" />
    <property name="streamName" value="MyNormStream" />
    <property name="resource" value="#{jobParameters['folder.location']}/export-#{jobParameters['sequence.number']}." />
    <property name="encoding" value="#{jobParameters['encoding']}" />
  </bean>

I got this stack, i don't understand why this internal code make this stack :

18:03:06.000987|I|SimpleStepHandler                       |Executing step: [createImportDocumentFileStep]
18:03:07.000074|D|JdbcPagingItemReader                    |Jumping to page 0 and index 0
18:05:35.000749|E|AbstractStep                            |Encountered an error executing the step
java.lang.IllegalStateException: Missing state information for key 'BeanIOFlatFileItemWriter.bw.m.MyNormStream.count'
at org.beanio.internal.parser.Group.restoreState(Group.java:540) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.BeanWriterImpl.restoreState(BeanWriterImpl.java:163) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.spring.BeanIOFlatFileItemWriter$Stream.open(BeanIOFlatFileItemWriter.java:404) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.spring.BeanIOFlatFileItemWriter.open(BeanIOFlatFileItemWriter.java:101) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at com.sun.proxy.$Proxy32.open(Unknown Source) ~[na:na]
at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:93) ~[spring-batch-infrastructure-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:301) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:192) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:293) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48) ~[spring-core-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) ~[spring-batch-core-2.1.9.RELEASE.jar:na]

beboner

unread,
Jul 2, 2013, 12:20:40 PM7/2/13
to bea...@googlegroups.com
Sometimes i got this stack instead (randomly)

18:17:29.000651|I|SimpleStepHandler                       |Executing step: [createImportDocumentFileStep]
18:19:38.000607|E|AbstractStep                            |Encountered an error executing the step
java.lang.NullPointerException: null
at org.beanio.internal.parser.ParserLocal.get(ParserLocal.java:72) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.Record.updateState(Record.java:183) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.RecordAggregation.updateState(RecordAggregation.java:186) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.Group.updateState(Group.java:525) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.Group.updateState(Group.java:525) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.Group.updateState(Group.java:525) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.Group.updateState(Group.java:525) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.internal.parser.BeanWriterImpl.updateState(BeanWriterImpl.java:150) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.spring.BeanIOFlatFileItemWriter$Stream.update(BeanIOFlatFileItemWriter.java:456) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at org.beanio.spring.BeanIOFlatFileItemWriter.update(BeanIOFlatFileItemWriter.java:114) ~[beanio-2.1.0.M1.jar:2.1.0.M1]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) ~[spring-aop-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at com.sun.proxy.$Proxy32.update(Unknown Source) ~[na:na]
at org.springframework.batch.item.support.CompositeItemStream.update(CompositeItemStream.java:73) ~[spring-batch-infrastructure-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:243) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:293) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48) ~[spring-core-3.2.0.RELEASE.jar:3.2.0.RELEASE]
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) ~[spring-batch-core-2.1.9.RELEASE.jar:na]

Message has been deleted

beboner

unread,
Jul 3, 2013, 8:52:45 AM7/3/13
to bea...@googlegroups.com
I try to understand why the ParsingConext is null with a RecordAggregator? 

Group.class
    public void updateState(ParsingContext context, String namespace, Map<String, Object> state) {
        state.put(getKey(namespace, COUNT_KEY), count.get(context));
        
        String lastMatchedChildName = "";
        Selector lastMatch = lastMatched.get(context);
        if (lastMatch != null) {
            lastMatchedChildName = lastMatch.getName();
        }
        state.put(getKey(namespace, LAST_MATCHED_KEY), lastMatchedChildName);

        // allow children to update their state
        for (Component node : this) {
            ((Selector)node).updateState(context, namespace, state);
        }
    }

RecordAggregation.class
    /*
     * (non-Javadoc)
     * @see org.beanio.internal.util.StatefulWriter#updateState(java.lang.String, java.util.Map)
     */
    public void updateState(ParsingContext context, String namespace, Map<String, Object> state) {
        getSelector().updateState(null, namespace, state);
    }

Record.class
    /**
     * Updates a Map with the current state of the Marshaller.  Used for
     * creating restartable Writers for Spring Batch.
     * @param namespace a String to prefix all state keys with
     * @param state the Map to update with the latest state
     * @since 1.2
     */
    public void updateState(ParsingContext context, String namespace, Map<String, Object> state) {
        state.put(getKey(namespace, COUNT_KEY), count.get(context)); <= context is null
    }

ParserLocal.class
    /**
     * Gets the value.
     * @param context the {@link ParsingContext} to get the value from
     * @return the value
     */
    @SuppressWarnings("unchecked")
    public final T get(ParsingContext context) {
        return (T) context.getLocal(index);  <= context is null
    }

Kevin

unread,
Jul 3, 2013, 3:55:45 PM7/3/13
to bea...@googlegroups.com
Yeah, that looks like a bug, but I need a few days before I'll have time to look into it.

Thanks,
Kevin

Kevin

unread,
Jul 7, 2013, 4:42:44 PM7/7/13
to bea...@googlegroups.com
Hello,

I agree that RecordAggregation probably shouldn't be passing 'null' there.  Did you try changing that to see if would resolve the issue?  Or can you try the attached snapshot JAR?

Thanks,
Kevin
beanio-2.1.0.SNAPSHOT.jar

beboner

unread,
Jul 11, 2013, 8:13:49 AM7/11/13
to bea...@googlegroups.com
That works, thanks
Reply all
Reply to author
Forward
0 new messages