Spring StateMachine 如何知道转换是否由于防护或操作失败而被拒绝?

问题描述

我有与以下主题相同的问题,但我不确定我的方法是否错误

How do I know if a guard rejected a transistion

我的应用是一款线性分步策略棋盘游戏,具有多种不同的游戏设置。我决定使用 Spring StateMachine 来解决,因为在我看来(到目前为止)它解决了很多与代码相关的组织问题但现在我被堆积了

我遇到的问题是,我无法确定我的事件是否通过了所有守卫并发生了转换。当一个事件被添加到队列时,我只是得到 true-flag

我遵循的方法是通过 event-context 传递数据,使用守卫验证一个数据并使用操作应用更改

        transitions
            .withExternal().source(SPEECHES).target(VOTING).event(VOTING_EVENT)
            .guard(Guard.and(
                    guards.get(NoVotesFromSUSPECTedGuard.QUALIFIER),guards.get(NoSelfVotingGuard.QUALIFIER),guards.get(NoDeadParticipantsVotingGuard.QUALIFIER),guards.get(NoVotingForDeadParticipantsGuard.QUALIFIER),votingOutOfParticipantListGuardFactory.get(NUMBER_OF_PLAYERS),guards.get(VotingBasedOnPrevIoUsOneGuard.QUALIFIER)
            ))
            .action(actions.get(CalculateVotingAction.QUALIFIER))

据我所知,没有可能通知 event-supplier 守卫评估失败。如果是这样,请告诉我,我将切换到另一个 SM 实现。但如果有任何可能解决我的问题,请帮助我。

我期望的行为是失败的守卫的任何元信息(构建格式化的错误消息)

解决方法

您可以使用一些上下文标志,例如 context.put("NoVotesFromSuspectedGuard",false) 当“NoVotesFromSuspectedGuard”不是 success 时,然后您可以在调用代码 context.getExternalVariables().get("NoVotesFromSuspectedGuard",Boolean.class) 中检查此变量。 此外,在 Spring State Machine 中,您可以声明 ActionListener bean,其中包含一些用于 StateMachine 事件监控的不同方法。

有关详细信息,请参阅Habr(俄语)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...