FlowExecutionException在实现StepListener的ItemWriter中发生捕获的异常时

时间:2015-06-30 11:24:42

标签: spring-batch

我在Spring Batch代码中遇到异常,我怀疑是由于一些错误的配置。首先,我将给出背景,然后是我遇到的问题。

我正在使用Spring Batch 2.2.6.RELEASE

我有一份这样定义的工作(简化的摘录,我认为是相关的):

....    

<batch:job id="job1">
    <batch:step id="step1">        
        <batch:tasklet ref="myTasklet1"/>
    </batch:step>

    <batch:step id="step2" >
        <batch:tasklet ref="myTasklet2"/>
    </batch:step>

    <batch:step id="step3">
        <batch:tasklet>
            <batch:chunk reader="myReader" processor="myProcessor" writer="myCompositeWriter" commit-interval="10" />
        </batch:tasklet>
        <batch:listeners>
            <batch:listener ref="myWriter2" />
        </batch:listeners>
    </batch:step>

    <batch:step id="step4" >
        <batch:tasklet ref="myTasklet4"/>
    </batch:step>

</batch:job>

...

<bean id="myCompositeWriter " class="org.springframework.batch.item.support.CompositeItemWriter">
    <property name="delegates">
        <list>
            <ref bean="myWriter1" />
            <ref bean="myWriter2" />
        </list>
    </property>
</bean>

<bean id="myWriter2" class="my.test.MyWriter2" scope="step" />

...

简化的writer2如下:

public class MyWriter2 implements ItemWriter<Object>, StepExecutionListener {

    private ExecutionContext jobContext;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        JobExecution jobExecution = stepExecution.getJobExecution();
        this.jobContext = jobExecution.getExecutionContext();
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return null;
    }


    @Override
    public void write(List<? extends Object> items) {
        try {
            // database insertion
        } catch (Exception e) {
            // add exception to context for later notifications
            jobContext.put("writer2_error", e);
        }
     }
 }

一些要求:

  • 需要从所有tasklet和writer2访问jobContext。从tasklet访问jobcontext非常简单。 writer2实现了StepExecutionListener,并在步骤3中将其注册为侦听器,以便能够访问它。
  • writer2将数据插入数据库。此操作可能会失败,但应该允许作业继续执行,如果其他一切正常,则作业应该成功结束。这就是为什么插入异常都被捕获的原因。

问题:

如果writer2中的writer操作失败,则会捕获异常,但是在step3之后作业失败。 在Spring Batch管理控制台中,步骤1,2和3状态为COMPLETED,步骤4状态为NONE,作业状态和退出代码为FAILED,并显示下一个异常:

org.springframework.batch.core.JobExecutionException: Flow execution ended unexpectedly at
org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:141) at
org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301) at
org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by:
org.springframework.batch.core.job.flow.FlowExecutionException: Ended flow=job1 at state=step3 with exception at
org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:160) at 
org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:130) at 
org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 
... 5 more Caused by: java.util.EmptyStackException at 
org.codehaus.jettison.util.FastStack.peek(FastStack.java:39) at 
org.codehaus.jettison.mapped.MappedXMLStreamWriter.setNewValue(MappedXMLStreamWriter.java:121) at 
org.codehaus.jettison.mapped.MappedXMLStreamWriter.makeCurrentJSONObject(MappedXMLStreamWriter.java:113) at 
org.codehaus.jettison.mapped.MappedXMLStreamWriter.writeStartElement(MappedXMLStreamWriter.java:241) at 
com.thoughtworks.xstream.io.xml.StaxWriter.startNode(StaxWriter.java:162) at 
com.thoughtworks.xstream.io.xml.AbstractXmlWriter.startNode(AbstractXmlWriter.java:37) at 
com.thoughtworks.xstream.io.WriterWrapper.startNode(WriterWrapper.java:33) at 
com.thoughtworks.xstream.io.path.PathTrackingWriter.startNode(PathTrackingWriter.java:44) at 
com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper.startNode(ExtendedHierarchicalStreamWriterHelper.java:17) at 
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.writeItem(AbstractCollectionConverter.java:62) at 
com.thoughtworks.xstream.converters.collections.MapConverter.marshal(MapConverter.java:57) at 
com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:65) at 
com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:78) at 
com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:63) at com.thoughtworks.xstream.core.Tree

如果没有异常发生,则作业成功结束。

为什么会失败的任何想法?

感谢。

0 个答案:

没有答案