异步Spring Batch Job多步流控制

时间:2013-12-27 12:49:33

标签: spring asynchronous batch-processing

我有一个Spring批处理作业,配置为异步运行(从Web服务启动并使用注释将方法配置为异步)我的第一步成功运行。

我的问题是我已经配置了多个步骤,并且流程是根据步骤的状态确定的,即在完成后它转到步骤2但是在失败时它转移到发送邮件的故障处理步骤。删除注释时,流似乎按预期工作。但是,当我使用注释异步运行作业时,任何步骤都被配置为在完成时执行并执行。 流程配置示例:

<batch:job id="batchJob" restartable="true">
    <batch:step id="step1">
        <batch:tasklet ref="task1">
            <batch:listeners>
                <batch:listener ref="failureHandler" />
            </batch:listeners>
        </batch:tasklet>
        <batch:next on="HAS_ERRORS" to="reportError" />
        <batch:end on="*" />
        <batch:next on="COMPLETED" to="step2" />
    </batch:step>
    <batch:step id="step2">
        <batch:tasklet ref="task2">
            <batch:listeners>
                <batch:listener ref="failureHandler" />
            </batch:listeners>
        </batch:tasklet>
        <batch:next on="HAS_ERRORS" to="reportError" />
        <batch:end on="*" />            
    </batch:step>
    <batch:step id="reportError">
        <batch:tasklet ref="failError">
            <batch:listeners>
                <batch:listener ref="failureHandler" />
            </batch:listeners>
        </batch:tasklet>
        <batch:end on="*" />
    </batch:step>
</batch:job>

我试图返回一个已被忽略的ExitStatus和BatchStatus。

我已经实现了一个步骤执行监听器,但是我还没有实现一个消息传递机制来跨步骤进行通信,我在步骤执行上下文中没有看到任何内容,这表明了该步骤的结果。

我遇到的问题是,是否有一种方法或机制可能会被忽略,以便在步骤完成后获得步骤的状态?或者是批处理之外的消息传递机制是一种可接受的处理方式吗?

感觉感觉错误,一旦它完成异步时我看不到批处理步骤的状态(当我删除@Async注释时我得到预期的结果/失败)我认为可能存在在我的理解中我缺少的东西我已经花了一些时间来研究它,所以我们会欣赏正确方向的指针。

1 个答案:

答案 0 :(得分:1)

我无法再访问此特定代码。

我认为问题是由覆盖定义预期流量的XML配置的注释引起的。

通过改写,我们改变了我们预期的实际流量。