Государственный автомат весна - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно создать StateMachine для управления квестами. Я знаю, как создать конечный автомат, но я не могу его использовать. Это мой первый конечный автомат и первый проект с MongoDB.

Мой конечный автомат:

@Configuration
@EnableStateMachine
class QuestStateMachineConfig : EnumStateMachineConfigurerAdapter<QuestState, QuestEvent>() {

    @Throws(Exception::class)
    override fun configure(states: StateMachineStateConfigurer<QuestState, QuestEvent>) {
        states.withStates()
                .initial(QuestState.AWAITING)

                .state(QuestState.ASSIGNED)
                .state(QuestState.MARKED_TO_REJECT)
                .state(QuestState.IN_PROGRESS)

                .end(QuestState.DONE)
                .end(QuestState.REJECTED)
    }

@Throws(Exception::class)
override fun configure(transitions: StateMachineTransitionConfigurer<QuestState, QuestEvent>) {
    transitions.withExternal()
            .source(QuestState.AWAITING).target(QuestState.ASSIGNED).event(QuestEvent.ASSIGN)
            .and()
            ...
   }

Мне нужно создать квест с состоянием AWAITING, затем мне нужно изменить и сохранить его в базе данных, когда пользователь использует действие обновления. Как это сделать? И как я могу прослушать обратный вызов onSuccess этой операции?

1 Ответ

0 голосов
/ 02 июня 2019

Мне нужно создать квест с состоянием ОЖИДАНИЕ

Обычно это должен быть объект, созданный в БД. Возможно, вы хотите управлять состоянием этого объекта с помощью конечного автомата.

Чтобы получить экземпляр SM, вам нужно только внедрить его - вы уже определили экземпляр из-за @EnableStateMachine - при запуске приложения будет создан SM, и вы можете внедрить его там, где вам нужно.

"Мне нужно изменить и сохранить его в базе данных, когда пользователь использует обновление действие. Как это сделать? "

В какой-то момент «действие обновления» необходимо перевести на «событие обновления». Здесь много вариантов, в зависимости от ваших потребностей:

  • обновить квест в БД обычным способом (например, хранилище), а затем переместить токен состояния в SM в правильное состояние для квеста этого пользователя (вам понадобится какой-то способ сопоставить квест пользователя и экземпляр SM).

  • при «действии обновления» - отправьте событие на SM и дайте SM обновить квест в БД и перейти в новое состояние. Это может быть достигнуто с помощью « actions » или прослушивания определенного события и реагирования на него с помощью SM « listener ».

как прослушать обратный вызов onSuccess этой операции?

См. StateMachineListener для начальной точки, также проверьте этот ответ .

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