gpt4 book ai didi

spring-boot - 用于休息服务请求的 Spring 状态机配置

转载 作者:行者123 更新时间:2023-12-05 05:11:54 24 4
gpt4 key购买 nike

我有一个简单的订单处理应用程序,并尝试应用 spring 状态机来处理订单状态。我想知道如何在来自休息服务的多个请求期间处理同一订单的订单状态。

订单状态:

enum OrderEvents {
FULFILL,
PAY,
CANCEL
}

订单事件:

enum OrderStates {
SUBMITTED,
PAID,
FULFILLED,
CANCELLED
}

状态机配置:

@Log
@Configuration
@EnableStateMachineFactory
class SimpleEnumStatemachineConfiguration extends StateMachineConfigurerAdapter<OrderStates, OrderEvents> {

@Override
public void configure(StateMachineTransitionConfigurer<OrderStates, OrderEvents> transitions) throws Exception {
transitions
.withExternal().source(OrderStates.SUBMITTED).target(OrderStates.PAID).event(OrderEvents.PAY)
.and()
.withExternal().source(OrderStates.PAID).target(OrderStates.FULFILLED).event(OrderEvents.FULFILL)
.and()
.withExternal().source(OrderStates.SUBMITTED).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL)
.and()
.withExternal().source(OrderStates.PAID).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL);
}

@Override
public void configure(StateMachineStateConfigurer<OrderStates, OrderEvents> states) throws Exception {
states
.withStates()
.initial(OrderStates.SUBMITTED)
.state(OrderStates.PAID)
.end(OrderStates.FULFILLED)
.end(OrderStates.CANCELLED);
}

@Override
public void configure(StateMachineConfigurationConfigurer<OrderStates, OrderEvents> config) throws Exception {
config.withConfiguration()
.autoStartup(true)
}
}

在我的订单服务中我调用

StateMachine<OrderStates, OrderEvents> sm = this.factory.getStateMachine(orderIdKey);

但似乎每次都会为相同的 orderIdKey 创建新的状态机。那么,如何访问在下一个状态提交订单时创建的状态机?

最佳答案

你基本上有两个选择:

a) 为给定的 orderId 保留状态机, 使用 state machine persister正如解释的那样 here .

b) 为给定的 orderId 创建一个新的状态机(每个 HTTP 请求)并根据 order entity 的状态重新水化 SM 状态对于给定的 orderId . SM 对象被认为是轻量级的,因此这也是一种可行的方法。下面是一个代码示例:

StateMachine<Status, Event> build(long orderId) {
orderService.getOrder(orderId) //returns Optional
.map(order -> {
StateMachine<Status, Event> sm = stateMachineFactory.getStateMachine(Long.toString(orderId));
sm.stop();
rehydrateState(sm, sm.getExtendedState, order.getStatus());
sm.start();
return sm;
})
.orElseGet(() -> createNewStateMachine(orderId);
}


void rehydrateState(StateMachine<Status, Event> newStateMachine, ExtendedState extendedState, Status orderStatus) {
newStateMachine.getStateMachineAccessor().doWithAllRegions(sma ->
sma.resetStateMachine(new DefaultStateMachineContext<>(orderStatus, null, null, extendedState));
});
}

关于spring-boot - 用于休息服务请求的 Spring 状态机配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54975168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com