我在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仍然没有以“已停止”状态更新。
答案 0 :(得分:0)
我从外部系统收到回复的时间,我发送邮件的tasklet
交易没有得到承诺。
为了解决上述问题,我使用了一个步骤执行监听器,我在tasklet
内部进行了所有数据库更新,并在“afterstep”执行监听器内部将消息发送到外部客户端,因此按时间流程到达“afterstep”执行监听器,tasklet
事务将被提交。
希望这会帮助有需要的人。