государственное мероприятие не вызывает действия - PullRequest
0 голосов
/ 09 июля 2019

Я построил конечный автомат для потока заказов, в котором я столкнулся с некоторыми проблемами. Я добавил переходы, но когда я вызываю событие, оно возвращает 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;
}

Я не понимаю, где это неправильно. пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...