You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:03