Я построил конечный автомат для потока заказов, в котором я столкнулся с некоторыми проблемами.
Я добавил переходы, но когда я вызываю событие, оно возвращает false. Кроме того, метод бина действия не поражает.
когда вызывается событие, я получаю журнал, в котором говорится, что конечный автомат создан, и отслеживание состояния, существует действие action (), которое должно быть вызвано при этом действии.
код выглядит примерно так:
переопределены методы настройки для состояния и перехода
@Override
public void configure(StateMachineConfigurationConfigurer < OrderStates, OrderEvents > config) throws Exception {
config.withConfiguration().autoStartup(false).listener(new OrderStateMachineListener());
}
@Override
public void configure(StateMachineStateConfigurer < OrderStates, OrderEvents > states) throws Exception {
states.withStates().initial(OrderStates.INIT, orderAction()).state(OrderStates.DRAFT, orderAction())
.state(OrderStates.PROBLEM, orderAction()).state(OrderStates.DIRECTCOMPLETE).state(OrderStates.NEW)
.state(OrderStates.CHECKWH).state(OrderStates.AVAILWH).state(OrderStates.STORESEND)
.state(OrderStates.STOREREC).state(OrderStates.READYFORPICKUP).state(OrderStates.PICKED)
.state(OrderStates.PACKED).state(OrderStates.READYTOSHIP).state(OrderStates.SHIPPED)
.state(OrderStates.OUTFORDELIVERY).state(OrderStates.RETURN).state(OrderStates.RETURNINPROCESS)
.state(OrderStates.RETURNCOMPLETE).state(OrderStates.DRAFT).state(OrderStates.FAIL)
.state(OrderStates.READYTOCOLLECT).state(OrderStates.ARRIVED).state(OrderStates.REJECTED)
.state(OrderStates.COMPLETED).state(OrderStates.CANCEL);
}
@Override
public void configure(StateMachineTransitionConfigurer < OrderStates, OrderEvents > transitions) throws Exception {
transitions.withExternal()
.source(OrderStates.INIT)
.target(OrderStates.DRAFT)
.and().withExternal()
.source(OrderStates.DRAFT)
.target(OrderStates.NEW)
.and().withExternal()
.source(OrderStates.NEW)
.target(OrderStates.CHECKWH)
.and().withExternal()
.source(OrderStates.CHECKWH)
.target(OrderStates.AVAILWH)
.and().withExternal()
.source(OrderStates.AVAILWH)
.target(OrderStates.STORESEND)
.and().withExternal()
.source(OrderStates.STORESEND)
.target(OrderStates.STOREREC)
.and().withExternal()
.source(OrderStates.NEW)
.target(OrderStates.READYFORPICKUP)
.and().withExternal()
.source(OrderStates.READYFORPICKUP)
.target(OrderStates.PICKED)
.and().withExternal()
.source(OrderStates.PICKED)
.target(OrderStates.PACKED)
.and().withExternal()
.source(OrderStates.PACKED)
.target(OrderStates.READYTOCOLLECT)
.and().withExternal()
.source(OrderStates.READYTOCOLLECT)
.target(OrderStates.ARRIVED)
.and().withExternal()
.source(OrderStates.ARRIVED)
.target(OrderStates.COMPLETED)
.and().withExternal()
.source(OrderStates.ARRIVED)
.target(OrderStates.REJECTED)
.and().withExternal()
.source(OrderStates.REJECTED)
.target(OrderStates.CANCEL).and()
.withExternal().source(OrderStates.PACKED)
.target(OrderStates.READYTOSHIP)
.and().withExternal()
.source(OrderStates.READYFORPICKUP)
.target(OrderStates.SHIPPED)
.and().withExternal()
.source(OrderStates.SHIPPED)
.target(OrderStates.OUTFORDELIVERY)
.and().withExternal()
.source(OrderStates.OUTFORDELIVERY)
.target(OrderStates.COMPLETED)
.and().withExternal()
.source(OrderStates.COMPLETED)
.target(OrderStates.RETURN)
.and().withExternal()
.source(OrderStates.OUTFORDELIVERY)
.target(OrderStates.FAIL)
.and().withExternal()
.source(OrderStates.FAIL)
.target(OrderStates.CANCEL)
.and().withExternal()
.source(OrderStates.DRAFT)
.target(OrderStates.DIRECTCOMPLETE)
.and().withExternal()
.source(OrderStates.DIRECTCOMPLETE)
.target(OrderStates.COMPLETED)
.and().withExternal()
.source(OrderStates.DRAFT)
.target(OrderStates.PROBLEM)
.and().withExternal()
.source(OrderStates.PROBLEM)
.target(OrderStates.NEW)
.and().withExternal()
.source(OrderStates.PROBLEM)
.target(OrderStates.CANCEL)
.and().withExternal()
.source(OrderStates.RETURN)
.target(OrderStates.RETURNINPROCESS)
.and().withExternal()
.source(OrderStates.RETURNINPROCESS)
.target(OrderStates.RETURNCOMPLETE)
.and().withExternal()
.source(OrderStates.RETURN)
.target(OrderStates.DRAFT)
.and();
}
@Bean
public Action < OrderStates, OrderEvents > orderAction() {
return new Action < OrderStates, OrderEvents > () {
@Override
public void execute(StateContext < OrderStates, OrderEvents > context) {
String orderId = (String) context.getMessage().getHeaders().get("orderId");
System.out.println(orderId);
Orders currentOrder = orderBO.getOrderById(orderId);
if (currentOrder != null) {
currentOrder.setOrderStatus(context.getStateMachine().getState().getId().name());
orderBO.updateOrder(currentOrder);
System.out.println("Target state..." + context.getTarget().getId().name());
}
}
};
}
это то, как я вызываю событие (это в другом методе другого класса)
«Заказы» - это спящий объект, я назначаю статус по умолчанию как INIT.
затем вызывая событие DRAFT, с помощью которого моя цель состоит в том, чтобы вызвать "execute" метод bean-компонента orderAction () (приведенного в теле кода выше).
public void newOrders(...) {
Orders order = new Orders();
order.setOrderStatus(OrderEvents.INIT.name());
addOrder(order);
StateMachine < OrderStates, OrderEvents > sm = build2(order.getUid(), order.getOrderStatus());
OrderEvents event = OrderEvents.INIT;
Message < OrderEvents > message = MessageBuilder.withPayload(event).setHeader("orderId", order.getUid()).setHeader("requestData", orderRequest).build();
boolean called = sm.sendEvent(message);
called = sm.sendEvent(event);
}
метод build2, который создает машину состояний из фабрики
private StateMachine < OrderStates, OrderEvents > build2(String orderId, String status) {
Orders currentOrder = getOrderById(orderId);
StateMachine < OrderStates, OrderEvents > sm = statefactory2.getStateMachine(orderId);
sm.stop();
sm.getStateMachineAccessor()
.doWithAllRegions(new StateMachineFunction < StateMachineAccess < OrderStates, OrderEvents >> () {
@Override
public void apply(StateMachineAccess < OrderStates, OrderEvents > sma) {
/*
* if (currentOrder.getMpOrderStatus().equalsIgnoreCase
* (States.READYFORPICKUP.name())) {
*/
sma.addStateMachineInterceptor(new StateMachineInterceptorAdapter < OrderStates, OrderEvents > () {
@Override
public void preStateChange(State < OrderStates, OrderEvents > state,
Message < OrderEvents > message, Transition < OrderStates, OrderEvents > transition,
StateMachine < OrderStates, OrderEvents > stateMachine) {
Optional.ofNullable(message).ifPresent(msg - > {
Optional.ofNullable(
Long.class.cast(msg.getHeaders().getOrDefault(currentOrder.getUid(), -1 L)))
.ifPresent(orderId1 - > {
System.out.println("New State save");
});
});
System.out.println("Pre state change" + stateMachine.getState().getId().name());
}
});
sma.resetStateMachine(new DefaultStateMachineContext < OrderStates, OrderEvents > (
getOrderState2(status), null, null, null));
/* } */
}
});
sm.start();
return sm;
}
Я не понимаю, где это неправильно. пожалуйста, помогите.