问题描述
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(俄语)