Spring 批处理数据库未更新

Spring Batch DB not getting updated

我正在 Tasklet 中编写业务逻辑,我正在向其中一个外部系统 A 的队列发送消息,然后使用 operator.stop() 方法停止作业(有时响应来得很晚,所以我正在释放通过停止 spring 批处理作业来获取系统资源)。

一旦我收到来自 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 的响应并且 spring 集成的服务激活器被调用并且由于某种原因 spring 批处理数据库永远不会更新为 "STOPPED" ,而是数据库条目将作业状态显示为 "STOPPING" 并且因此我无法在服务激活器中重新启动作业,因为它是仍处于 "STOPPING" 状态。

任何人都可以告诉我为什么 spring 批处理数据库没有更新 "STOPPED" state 的状态。

EDIT- 我已经尝试在将消息发送到 SystemA 的队列之前停止作业,但仍然 SPRING BATCH DB 没有得到 "STOPEED" 的更新状态。

当我从外部系统收到响应时,我正在发送消息的 tasklet 事务没有得到提交。

为了解决上述问题,我使用了一个步骤执行侦听器,我在 tasklet 和 "afterstep" 执行侦听器中进行了所有数据库更新,我将消息发送到外部客户端,所以当流到达 "afterstep" 执行侦听器时,tasklet 事务将被提交。

希望这对有需要的人有所帮助。