Spring StateMachine发送事件后无法获取最新状态问题咨询
Spring StateMachine响应式接口返回旧状态的问题解决
问题原因
你使用的响应式sendEvent(Mono<Message>)返回的Mono仅表示事件已提交到状态机处理队列,而非状态转换已经完成。状态机的事件处理和状态变更都是异步执行的,所以你在then中同步调用stateMachine.getState()时,新状态还未生效,自然返回初始状态。
而废弃的非响应式sendEvent是阻塞式实现,它会等待事件处理和状态转换全部完成后才返回,因此能直接拿到最新状态。
解决方案
不要同步获取状态,改用响应式方式获取最新状态。ReactiveStateMachine的getState()方法本身返回Mono<State<S, E>>,它会在状态变更完成后发出最新状态。修改代码如下:
return stateMachine.sendEvent(Mono.just(new Message<OrchestratorEvent>() { @Override public OrchestratorEvent getPayload() { return OrchestratorEvent.PRODUCTION_DONE; } @Override public MessageHeaders getHeaders() { return new MessageHeaders(Collections.emptyMap()); } })) .then(stateMachine.getState()) .map(state -> state.getId().getStringValue());
关键说明
then(stateMachine.getState())会在sendEvent的Mono完成后,订阅状态机的最新状态流,确保拿到的是事件处理完成后的状态。- 避免同步调用
stateMachine.getState(),这会破坏响应式流的异步特性,导致读取到未更新的快照状态。
内容的提问来源于stack exchange,提问作者loganrussell48
相关产品推荐
相关产品推荐

