我有一个简单的订单处理应用程序,并尝试应用弹簧状态机来处理订单状态。 我想知道在来自REST服务的多个请求期间如何处理同一订单的订单状态。
订单状态:
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创建新的状态机。那么,如何在下一个状态提交订单时访问创建的状态机?
答案 0 :(得分:0)
您基本上有两个选择:
a)使用state machine persister所述的here来保持给定orderId
的状态机。
b)(针对每个HTTP请求)为给定的orderId
创建一个新的状态机,并根据给定的order entity
的{{1}}的状态对SM状态进行重新水化处理。 SM对象被认为是轻量级的,因此这也是一种可行的方法。下面是一个代码示例:
orderId