Spring Batch DB没有得到更新

时间:2015-09-23 10:23:34

标签: spring workflow spring-integration spring-batch

我在Tasklet中编写业务逻辑,我正在向外部systemA的队列中的一个发送消息,然后使用operator.stop()方法停止作业(有时响应很晚,所以我通过以下方式发布系统的资源停止春季批量工作)。

我收到systemA的回复后,我需要再次从上一份完成的工作重新开始工作。

这就是我在tasklet中所做的。

public RepeatStatus execute(StepContribution stepCon, ChunkContext chunkCtx)
            throws Exception {

        JobOperator operator= (JobOperator)ApplicationContextProvider.getApplicationContext().getBean("jobOperator");

            String msg = "some msg";
    //Sending message to channel created using spring integration.
    messageChannel.send(MessageBuilder.withPayload(msg).build());
        //Stopping job with the job_exe_id 123
            operator.stop(123);
            ExitStatus es = new ExitStatus("MSG_SENT");
            stepCon.setExitStatus(es);
            return null;

    }

我现在面临的问题是,一旦消息被发送到systemA的队列,我立即得到来自systemA的响应并且弹出集成的服务激活器被调用,并且由于某种原因,弹出批处理DB永远不会被更新为“STOPPED”,而DB条目将作业状态显示为“STOPPING”,因此我无法在服务激活器内重新启动作业,因为它仍处于“STOPPING”状态。

有谁能请让我知道为什么Spring批处理DB没有更新状态为“STOPPED”状态。

编辑 - 我已经尝试在将消息发送到SystemA的队列之前停止作业,但是SPRING BATCH DB仍然没有以“已停止”状态更新。

1 个答案:

答案 0 :(得分:0)

我从外部系统收到回复的时间,我发送邮件的tasklet交易没有得到承诺。

为了解决上述问题,我使用了一个步骤执行监听器,我在tasklet内部进行了所有数据库更新,并在“afterstep”执行监听器内部将消息发送到外部客户端,因此按时间流程到达“afterstep”执行监听器,tasklet事务将被提交。

希望这会帮助有需要的人。