首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在StateMachineListener中获取StateContext以及如何配置状态以实现我的状态图?

在StateMachineListener中获取StateContext的方法是通过在方法参数中添加StateContext类型的参数。StateContext是Spring State Machine框架提供的一个接口,它包含了与状态机相关的信息,如当前状态、事件、转换等。

下面是一个示例代码,展示了如何在StateMachineListener中获取StateContext:

代码语言:txt
复制
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.transition.Transition;

public class MyStateMachineListener extends StateMachineListenerAdapter<String, String> {

    @Override
    public void stateChanged(State<String, String> from, State<String, String> to) {
        // 在状态变化时获取StateContext
        StateContext<String, String> stateContext = getStateContext();
        // 进行相关操作
    }

    @Override
    public void transition(Transition<String, String> transition) {
        // 在状态转换时获取StateContext
        StateContext<String, String> stateContext = getStateContext();
        // 进行相关操作
    }

    private StateContext<String, String> getStateContext() {
        // 通过ThreadLocal获取StateContext
        return StateContextHolder.getStateContext();
    }
}

在上述代码中,我们通过继承StateMachineListenerAdapter类,并重写stateChanged()和transition()方法来监听状态变化和状态转换事件。在这两个方法中,我们可以通过调用getStateContext()方法来获取StateContext对象,从而获取与状态机相关的信息。

配置状态以实现状态图可以通过使用Spring State Machine框架提供的DSL(Domain Specific Language)来完成。DSL提供了一种声明式的方式来定义状态和状态之间的转换关系。

下面是一个示例配置,展示了如何使用DSL来配置状态和转换:

代码语言:txt
复制
@Configuration
@EnableStateMachine
public class MyStateMachineConfig extends StateMachineConfigurerAdapter<String, String> {

    @Override
    public void configure(StateMachineStateConfigurer<String, String> states) throws Exception {
        states
            .withStates()
                .initial("STATE1")
                .state("STATE2")
                .state("STATE3")
                .end("STATE4")
                .and()
            .withStates()
                .parent("STATE2")
                .initial("STATE2_1")
                .state("STATE2_2")
                .end("STATE2_3");
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception {
        transitions
            .withExternal()
                .source("STATE1").target("STATE2").event("EVENT1")
                .and()
            .withExternal()
                .source("STATE2_1").target("STATE2_2").event("EVENT2")
                .and()
            .withExternal()
                .source("STATE2_2").target("STATE2_3").event("EVENT3")
                .and()
            .withExternal()
                .source("STATE2_3").target("STATE3").event("EVENT4")
                .and()
            .withExternal()
                .source("STATE3").target("STATE4").event("EVENT5");
    }
}

在上述代码中,我们通过@Configuration注解将该类标记为配置类,并通过@EnableStateMachine注解启用状态机。然后,我们重写configure()方法来配置状态和转换。

在configure()方法中,我们使用StateMachineStateConfigurer来配置状态,使用StateMachineTransitionConfigurer来配置转换。通过调用withStates()方法来定义状态,调用withExternal()方法来定义转换。在状态和转换的定义中,我们可以使用initial()方法来定义初始状态,使用state()方法来定义普通状态,使用end()方法来定义终止状态。

以上是关于如何在StateMachineListener中获取StateContext以及如何配置状态以实现状态图的答案。如果你想了解更多关于Spring State Machine框架的信息,可以访问腾讯云的产品介绍页面:Spring State Machine产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

状态机入门实践

有多种实现方案,:枚举,Spring Statemachine,cola state machine。 枚举状态机 通过在枚举定义方法来实现状态转移,状态定义及转换图示例如下。...// 这个类定义不是必须,存粹是为了方便通过@Bean注解方式配置状态机监听器StateMachineListener public class StateMachineContext {...Cola状态机 Cola状态使用和配置比Spring StateMachine简单直接,电商场景订单状态转换为例进行阐述。...模式就是使用状态机机制实现,但是其状态转换并非硬编码配置,而是通过状态机设计器进行编排最终导出为json格式文件,每一个分布式事务业务流程就对应一个编排文件。...全网首发:Seata Saga状态机设计器实战 如何将Saga建模为状态机 保姆式教程!如何使用Cola-statemachine构建高可靠性状态机 ?

8610

Spring状态

有限状态机简称就是状态机,因为一般状态状态都是离散和可举,即为有限,所以后面的介绍都不加有限二字。状态机表示有限个状态以及在这些状态之间转移和动作等行为数学模型。...通俗描述状态机就是定义了一套状态変更流程:状态机包含一个状态集合,定义当状态机处于某一个状态时候它所能接收事件以及可执行行为,执行完成后,状态机所处状态。...其他状态都是一些流转停留状态。标准状态机还会涉及到一些中间态,存在中间态状态机流程就会比较复杂(用处也不是特别大,而且可以通过其他方式实现),所以在目标实现状态机里不会引入这个概念。...定义Transition就是在定义状态运转流程 如果你写过很复杂流程系统,流程系统涉及多步操作,流程达到不同状态需要有不同处理,同时状态转换也是有特定逻辑。...如果不使用状态机,那么你代码估计会有大量if判断语句,你得判断某个操作指令过来了,当前这个状态是否能执行该指令。 Spring中有集成了一套状态机框架,我们可以使用该框架进行开发。

1.7K30

基于 Kotlin 特性开发有限状态

常用状态机分类 FSM 有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间转移和动作等行为数学模型。...状态表.jpg DFA 确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移自动机对于一个给定属于该自动机状态和一个属于该自动机字母表字符...DFA 特性: 没有冲突:一个状态对于同样输入,不能有多个规则,即每个输入只能有一个转移规则; 没有遗漏:每个状态都必须针对每个可能输入字符有至少一个规则 以前写过一篇文章《一个快速分析android...HSM 层次状态机(英语:Hierarchical State Machine)是状态机理论一种层次结构模型,各个状态按照树状层次结构组织起来,状态图是层次结构,也就是说每个状态可以拥有子状态...GlobalInterceptor 能够监听 State、Transition、StateContext 以及异常。

1.3K20

使用Spring StateMachine框架实现状态

通过上面的例子,我们可以对如何使用Spring StateMachine做如下小结: - 定义状态和事件枚举 - 为状态机定义使用所有状态以及初始状态 - 为状态机定义状态迁移动作 - 为状态机指定监听处理器...整个状态调度逻辑主要依靠配置方式定义,而所有的业务逻辑操作都被定义在了状态监听器,其实状态监听器可以实现功能远不止上面我们所述内容,它还有更多事件捕获,我们可以通过查看`StateMachineListener...注解实现 对于状态监听器,Spring StateMachine还提供了优雅注解配置实现方式,所有`StateMachineListener`接口中定义事件都能通过注解方式来进行配置实现。...比如,我们可以将之前实现状态监听器用注解配置来做进一步简化: ?...上述代码实现了与快速入门定义`listener()`方法创建监听器相同功能,但是由于通过注解方式配置,省去了原来事件监听器各种if判断,使得代码显得更为简洁,拥有了更好可读性。

2.9K90

状态基本原理以及SSM实践

SSM, 下面的内容将直接使用此简称),介绍下状态基本原理,以及在实践遇到一些坑。 一、什么是状态机?...除了使用状态建模分析问题,如果能够将状态整体模型应用到代码,将极大地提高系统拓展能力和灵活度。将状态机模型统一,将代码逻辑实现变成拓展点来实现。...基于状态机模型定义,进行实例化;实例化状态机,会有当前流转状态、实例id等信息; 实体对象: 是指现实实体,订单,一个订单可能包含订单编号、商品名称、订单金额、当前状态、下单时间等一系列信息;...五、写在后面 本文从相对宏观角度,阐述了状态基本理念,以及SSM一些基础设计,尚未涉及到全部细节,父子状态机、Region、状态类型(内部状态、外部状态)、分布式状态机、状态机工厂等,以及 SSM...本身存在设计缺陷,以及如何在实践状态机进行改造,将另开一篇文章介绍~ 待续~ 如果在实践也遇到问题,欢迎一起讨论。

1K40

真实项目案例实战——【状态设计模式】使用场景 顶

这个状态通常用一个或多个枚举常量表示。 通常,有多个操作包含这一相同条件结构。State模式将每一个条件分支放入一个独立。...状态模式实现 需要重构代码 public class OrderService { public String orderState(String state) { if...在状态模式,每个状态通过持有Context引用,来实现状态转移;但是每个策略都不持有Context引用,它们只是被Context使用。.../ 2.使用上下文切换到不同状态 StateContext stateContext = new StateContext(orderState); stateContext.switchStateOrder...(); // 如果写多重if判断的话 整个代码流程 耗时比较长 直接Spring精准定位到策略或者是状态的话 Map get方法时候底层是数组 return "

2.1K30

高德打车通用可编排订单状态机引擎设计

当订单状态、类型、场景、以及其他一些维度组合时,每一种组合都可能会有不同处理逻辑、也可能会存在共性业务逻辑,这种情况下代码各种if-else肯定是不敢想象。...抽象一个基础逻辑接口、每一个状态或者类型都实现该接口,业务处理时根据不同状态或者类型调用对应业务实现到达逻辑相互独立互不干扰、代码隔离目的。...、开发多个实现类来执行情况,我们思考执行这些实现类在流程上是否有再次抽象和封装地方、减少研发工作量和尽量实现通用流程。...2 横向解决逻辑复用和实现业务扩展 实现基于"多类型+多场景+多维度"代码分离治理、以及标准处理流程模板状态机模型之后,其实在真正编码时候会发现不同类型不同维度对于同一个状态流程处理过程,有时多个处理逻辑一部分流程一样或者是相似的...之后引擎根据state+event+bizCode+sceneId从状态处理器容器获取到对应具体处理器processor,从而进行状态迁移处理。

68731

UML图依赖、关联、聚合、组合关系(突击软考)

目录 UML各种图: 1、用例图 2、类图 3、对象图 4、活动图 5、状态图 6、序列图(顺序图) 7、协作图 8、构件图 (组件图) 9、部署图 (配置图) 几种图区别: 一:这九种模型图各有侧重...能够演示出系统哪些地方存在功能,以及这些功能和系统其他组件功能如何共同满足前面使用用例图建模商务需求。 5、状态图     描述类对象所有可能状态以及事件发生时状态转移条件。...一个状态图应该连接到所有具有清晰可标识状态和复杂行为类;该图可以确定类行为,以及该行为如何根据当前状态变化,也可以展示哪些事件将会改变类对象状态状态图是对类图补充。...顺序图将显示重点放在消息序列上,即强调消息是如何在对象之间被发送和接收。 7、协作图     和序列图相似,显示对象间动态合作关系。...9、部署图 (配置图)     是用来建模系统物理部署。例如计算机和设备,以及它们之间是如何连接。部署图使用者是开发人员、系统集成人员和测试人员。

89210

🔥不会状态机?不知道状态模式?不会利用它来减少if else?来看看这篇文章!!!

,还想区分加了这些操作后用户,其他不符合这个条件用户不要影响,能不能实现啊! :能啊,加个状态就行啊!于是将原流程加了个状态,当用户处于这个状态时会如何如何.........整个状态调度逻辑主要依靠配置方式定义,而所有的业务逻辑操作都被定义在了状态监听器。...其实状态监听器可以实现功能远不止上面我们所述内容,它还有更多事件捕获,我们可以通过查看StateMachineListener接口来了解它所有的事件定义: 总结 状态模式核心是封装,将状态以及状态转换逻辑封装到类内部来实现...在我们应用场景状态数量以及状态转换远比上述例子复杂,通过“状态模式”避免了大量if-else代码,让我们逻辑变得更加清晰。...同时由于状态模式良好封装性以及遵循设计原则,让我们在复杂业务场景,能够游刃有余地管理各个状态

1.4K151

软件设计实践:如何使用UML完成一个设计文档?

​在上一篇文章,我们讨论了为什么要建模,以及建模 4+1 视图模型,4+1 视图模型很好地向我们展示了如何对一个软件不同方面用不同模型图进行建模与设计,完整描述一个软件业务场景与技术实现。...下面我们讨论如何画这 7 种模型图,以及如何在需求分析、概要设计、详细设计三个阶段使用这 7 种模型输出合适设计文档。类图 类图是最常见 UML 图形,用来描述类特性和类之间静态关系。...因为用例图中功能描述比较简单,通常还需要对用例图配文字说明,形成需求文档。状态图 状态图用来展示单个对象生命周期状态变迁。...,状态要用枚举值表示,指导具体开发。...但难如何在合适场合下用正确 UML 模型表达自己设计意图,形成一套完整软件模型,进而组织成一个言之有物,层次分明,既可以指导开发,又可以在团队内外达成共识设计文档。

1.2K33

007尝试使用UML图

说明是谁要使用系统,以及他们使用该系统可以做些什么。 2、类图 类图是描述系统类,以及各个类之间关系静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。...4、活动图 描述用例要求所要进行活动,以及活动间约束关系,有利于识别并行活动。能够演示出系统哪些地方存在功能 5、状态图 描述类对象所有可能状态以及事件发生时状态转移条件。...可以捕获对象、子系统和系统生命周期。他们可以告知一个对象可以拥有的状态,并且事件(消息接收、时间流逝、错误、条件变为真等)会怎么随着时间推移来影响这些状态。...一个状态图应该连接到所有具有清晰可标识状态和复杂行为类;该图可以确定类行为,以及该行为如何根据当前状态变化,也可以展示哪些事件将会改变类对象状态状态图是对类图补充。...顺序图将显示重点放在消息序列上,即强调消息是如何在对象之间被发送和接收。 7、协作图 和序列图相似,显示对象间动态合作关系。

85820

UML——九种图和几大关系

大家好,又见面了,是你们朋友全栈君。 UML图画完已经有一段时间了,前几天师父验收时候,发现对这些图及其关系还需要进一步理解,所以又整理了一下。...描述用例要求所要进行活动,以及活动间约束关系,有利于识别并行活动。能够演示出系统哪些地方存在功能,以及这些功能和系统其他组件功能如何共同满足前面使用用例图建模商务需求。...图例: 5.状态图 类所描述事物补充说明,类所有对象可能具有的状态以及引起状态变化事物。 描述类对象所有可能状态以及事件发生时状态转移条件。...一个状态图应该连接到所有具有清晰可标识状态和复杂行为类;该图可以确定类行为,以及该行为如何根据当前状态变化,也可以展示哪些事件将会改变类对象状态状态图是对类图补充。...顺序图可以用来展示对象之间是如何进行交互。顺序图将显示重点放在消息序列上,即强调消息是如何在对象之间被发送和接收

2.1K10

再学UML-Bug管理系统UML2.0建模实例(三)

在对bug进行修复后,更新bug修复信息(修复内容、修复时间、修复人等),将更新bug信息发送给测试人员,系统将修改bug状态,然后通知测试人员获取最新版本进行验证。   ...2.4 状态图(需求模型)   在需求分析过程,我们发现BMS系统核心对象是bug,因此可以使用状态图对其进行建模。UML状态图可以用来描述一个特定对象所有可能状态及其引起状态转移事件。...在图2-7,我们可以清晰了解bug对象在系统中所具有的状态以及这些状态之间转换过程,测试人员提交bug其状态为“新提交bug”,开发组长查看后该bug状态将变为“开发组长已查看bug”。  ...2.5 活动图(需求模型)   在状态图中,我们描述了BMS系统bug对象各种状态以及状态之间转换关系,但是这些状态在转换过程无法确定何种状态由哪类执行者负责操作,因此可以通过活动图来进行建模...通过活动图建立模型比状态图建立模型具有更多信息,在BMS,我们描述了不同用户对bug操作活动以及在每一次活动之后bug对象所处于状态,对操作流程进行图形化建模,如图2-8所示: ?

94920

不会状态机?不知道状态模式?不会利用它来减少if else并解耦?来看看这篇文章!!!

,还想区分加了这些操作后用户,其他不符合这个条件用户不要影响,能不能实现啊! :能啊,加个状态就行啊!于是将原流程加了个状态,当用户处于这个状态时会如何如何.........整个状态调度逻辑主要依靠配置方式定义,而所有的业务逻辑操作都被定义在了状态监听器。...其实状态监听器可以实现功能远不止上面我们所述内容,它还有更多事件捕获,我们可以通过查看StateMachineListener接口来了解它所有的事件定义: 总结 状态模式核心是封装,将状态以及状态转换逻辑封装到类内部来实现...在我们应用场景状态数量以及状态转换远比上述例子复杂,通过“状态模式”避免了大量if-else代码,让我们逻辑变得更加清晰。...同时由于状态模式良好封装性以及遵循设计原则,让我们在复杂业务场景,能够游刃有余地管理各个状态

44220

商品上新业务状态机接入实践

获取实现时,优化获取当前渠道实现,找不到则尝试查找全渠道实现: public NspOperate getNspOperate(Integer applyType, String operateCode...明确一下状态机相关元素哪些是独立拆分,哪些是共用: 可以看到只有状态配置类是每个渠道不同,因此成本不高。guard和action实现如何实现所有渠道共用会在下文说明。...Guard与Action实现 从上文状态具体配置可以看到,新品来样流程涉及两类状态流转: 触发事件后目标状态是固定,比如选品审核时触发了选品不通过事件,新品申请目标状态将确定为选品不通过...新增商品来源渠道 配置状态机,针对新渠道实现各种业务操作和事件实现即可,不会影响到现有渠道。 新品来样新增状态节点 修改状态配置,增加新事件和对应实现类即可。...新品来样调整状态间顺序 修改状态配置,评估涉及业务操作实现修改,修改范围是明确和可控

9610

几分钟几张图教你学会如何使用UML

1.类图、对象图、接口 这三种图是uml中最简单图了,想看了下方三张图片你就明白了: ? ? ?...在类存在几种关系,是我们必须要掌握: 一般化关系:表示类与类继承、接口与接口之间继承、类对接口实现。 ?...依赖关系:依赖关系与一般化关系不同是一般话关系是一个类持有另一个类属性或方法,而依赖关系类方法参数为另一个类 ? 2.组件图 组件图可以简单理解为在一个系统物理组件。...3.部署图 部署图可以简单理解为硬件配置及其软件是如何在网络结构中部署(例如一个程序中一共有多少个tomcat、多少个mysql、多少个redis、他们分别部署在哪台服务器上)一起来看下图学习一下:...每一个箭头都是一个调用,生命线上白色条叫做激活条,激活条代表就是这次调用持续时间 6.状态图 状态图描述对象从开始到结束状态改变流程,下面同样以上方注册流程为例分析: ?

35430

几分钟几张图教你学会如何使用UML

1.类图、对象图、接口 这三种图是uml中最简单图了,想看了下方三张图片你就明白了: 在类存在几种关系,是我们必须要掌握: 一般化关系:表示类与类继承、接口与接口之间继承、类对接口实现。...例如程序包、类文件、配置文件、样式文件等。...学习组件图请看下图: 3.部署图 部署图可以简单理解为硬件配置及其软件是如何在网络结构中部署(例如一个程序中一共有多少个tomcat、多少个mysql、多少个redis、他们分别部署在哪台服务器上)...,下面一个简单注册流程为例分析: 在这个图片中,垂直虚线叫做生命线,代表一个对象存在时间。...每一个箭头都是一个调用,生命线上白色条叫做激活条,激活条代表就是这次调用持续时间 6.状态图 状态图描述对象从开始到结束状态改变流程,下面同样以上方注册流程为例分析:

53330

架构设计必知必会-UML

1.类图、对象图、接口 这三种图是uml中最简单图了,想看了下方三张图片你就明白了: ? ? ?...在类存在几种关系,是我们必须要掌握: 一般化关系:表示类与类继承、接口与接口之间继承、类对接口实现。 ?...依赖关系:依赖关系与一般化关系不同是一般话关系是一个类持有另一个类属性或方法,而依赖关系类方法参数为另一个类 ? 2.组件图 组件图可以简单理解为在一个系统物理组件。...3.部署图 部署图可以简单理解为硬件配置及其软件是如何在网络结构中部署(例如一个程序中一共有多少个tomcat、多少个mysql、多少个redis、他们分别部署在哪台服务器上)一起来看下图学习一下:...每一个箭头都是一个调用,生命线上白色条叫做激活条,激活条代表就是这次调用持续时间 6.状态图 状态图描述对象从开始到结束状态改变流程,下面同样以上方注册流程为例分析: ?

1K00

软件开发中会用到

UML类图是UML交互图中一种,也是我们较常见一种。类图是描述系统类,以及各个类之间关系静态视图。它不但是设计人员关心核心,更是实现人员关注核心。...由于现在有比较多工具可以从代码生成UML类图,甚至在大部分提倡使用Code First场景下,我们画UML类图机会是越来越少了。 7. 状态图 ? 状态图是对类图补充。...一个状态图应该连接到所有具有清晰可标识状态和复杂行为类;该图可以确定类行为,以及该行为如何根据当前状态变化,也可以展示哪些事件将会改变类对象状态。...时序图也是UML交互图中一种,是描述对象是如何交互,并且将重点放在消息序列上。也就是说,描述消息是如何在对象间发送和接收。时序图有两个坐标轴:纵坐标轴显示时间,横坐标轴显示对象。...然后再通过流程图、UML类图、状态图、E-R图、时序图在不同场景确定细节实现。最终就是Coding事情了。 至于每个图绘画规范网上资料比较多,这里就不赘述了。如果大家有什么疑问继续交流。

1.1K20

130. 精读《unstated 与 unstated-next 源码》

而在 Hooks ,我们可以随时调用 useState 提供 setter 函数修改值,这早已天然解决了 reducer 无法异步问题,同时也实现了 redux-chunk 功能。...我们看到这个方案可以利用 React 官方提供能力完全覆盖 Redux 中间件能力,对 Redux 库实现了降维打击,所以下一代数据流方案随着 Hooks 实现是真的存在。...最后,相比 Redux 自身以及其生态库理解成本(笔者不才,初学 Redux 以及其周边 middleware 时理解了好久),Hooks 理解学习成本明显更小。...希望每个团队老织布工人都能主动引入织布机。 再看取数中间件,我们一般需要解决 取数业务逻辑封装 与 取数状态封装,通过 redux 中间件可以封装在内,通过一个 dispatch 解决。...而取数状态已经封装在 useSWR ,配合 Suspense 能力,连 Loading 状态都不用关心了。 3 精读 unstated 我们再梳理一下 unstated 这个库做了哪些事情。

96710
领券