COLA中的cola-statemachine状态机理解与使用例

这篇具有很好参考价值的文章主要介绍了COLA中的cola-statemachine状态机理解与使用例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、cola-statemachine介绍

COLA框架的状态机组件是一种轻量级的、无状态的、基于注解的状态机实现,可以方便地管理订单等业务对象的状态转换。COLA框架的状态机使用了连贯接口Fluent Interfaces)来定义状态和事件,以及对应的动作和检查。COLA框架的状态机是COLA 4.0应用架构的一部分,旨在控制复杂度,提高开发效率。

COLA框架的状态机的优势有以下几点:

  • 简化了状态转换的逻辑,避免了大量的if-else判断
  • 提高了代码的可读性和可维护性,方便了单元测试和重构
  • 支持多种状态机模式,如同步、异步、延迟等
  • 与COLA框架的其他组件协同工作,实现领域驱动设计和六边形架构

二、COLA状态机的核心概念

  1. State:状态
  2. Event:事件,状态由事件触发,引起变化
  3. Transition:流转,表示从一个状态到另一个状态
  4. External Transition:外部流转,两个不同状态之间的流转
  5. Internal Transition:内部流转,同一个状态之间的流转
  6. Condition:条件,表示是否允许到达某个状态
  7. Action:动作,到达某个状态之后,可以做什么
  8. StateMachine:状态机

COLA中的cola-statemachine状态机理解与使用例

三、使用状态机

1. 环境配置

我的配置

Maven: 3.6.3
SDK: 17
Language level:8

引入依赖:

<dependency>
	<groupId>com.alibaba.cola</groupId>
	<artifactId>cola-component-statemachine</artifactId>
	<version>4.3.1</version>
</dependency>

2. cola状态机的三种transition方式

StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();
        //external transition
        builder.externalTransition()
                .from(States.STATE1)
                .to(States.STATE2)
                .on(Events.EVENT1)
                .when(checkCondition())
                .perform(doAction());

        //internal transition
        builder.internalTransition()
                .within(States.STATE2)
                .on(Events.INTERNAL_EVENT)
                .when(checkCondition())
                .perform(doAction());

        //external transitions
        builder.externalTransitions()
                .fromAmong(States.STATE1, States.STATE2, States.STATE3)
                .to(States.STATE4)
                .on(Events.EVENT4)
                .when(checkCondition())
                .perform(doAction());

        builder.build(machineId);

        StateMachine<States, Events, Context> stateMachine = StateMachineFactory.get(machineId);
        stateMachine.showStateMachine();

3、接口方法说明

a. StateMachineBuilder

StateMachineBuilder方法 说明
ExternalTransitionBuilder<S, E, C> externalTransition() 用于一个流转的构建器
ExternalTransitionsBuilder<S, E, C> externalTransitions() 用于多个流转的构建器
InternalTransitionBuilder<S, E, C> internalTransition() 开始构建内部流转
StateMachine<S, E, C> build(String machineId) 对状态机开始构建,并在StateMachineFactory中注册

b. StateMachine

StateMachine方法 说明
boolean verify(S sourceStateId, E event) 验证一个事件E是否可以从当前状态S触发
S fireEvent(S sourceState, E event, C ctx) 向状态机发送一个事件E,触发状态机,并返回目标状态
String getMachineId() 获取状态机的标识符MachineId
void showStateMachine() 使用访问者模式来显示状态机的结构

四、简单场景使用演示

0. 订单流程模拟(基本配置)

// 订单状态(States)
enum OrderState {
	INIT,
	PAID,
  	DELIVERED,
   	REFUNDED;
}

// 订单事件(Events)
enum OrderEvent {
	PAY_SUCCESS,
	PAY_FAIL,
	DELIVERED_SUCCESS,
	REFUND_SUCCESS;
}

// 订单(Context)
static class Order {
	String operator = "frank";
	String orderId = "123465";
}

static String MACHINE_ID = "orderStateMachine";

1. 外部状态流转(单个起始状态)

外部过程描述:起始状态INIT,结束状态PAID,当发生PAY_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态PAID,否则返回INIT

@Test
public void testExternalNormal(){
    // 第一步:生成一个状态机builder
    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();

    // 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform
    builder.externalTransition()
            .from(OrderState.INIT)
            .to(OrderState.PAID)
            .on(OrderEvent.PAY_SUCCESS)
            .when(checkCondition())
            .perform(doAction());

    // 第三步:设置状态机的id,并在StateMachineFactory中的stateMachineMap进行注册
    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID);

    // 第四步:触发状态机
    OrderState target = stateMachine.fireEvent(OrderState.INIT, OrderEvent.PAY_SUCCESS, new Order());
    assertEquals(OrderState.PAID, target);
}

a. checkCondition(示例)

private Condition<Order> checkCondition() {
    return order -> {
        System.out.println("Check condition : " + order);
        return true;
    };
}

方法体中使用了lambda表达式来创建一个Condition的实例,并返回它

b. doAction(示例)

private Action<OrderState, OrderEvent, Order> doAction() {
    return (from, to, event, ctx) -> {
        System.out.println(
                ctx.operator + " is operating " + ctx.orderId + " from:" + from + " to:" + to + " on:" + event));
    };
}

这段代码定义了一个私有方法,返回一个Action对象,该对象是一个函数式接口,接受四个参数:from, to, event, ctx,并执行一些逻辑。

  • from: 表示状态转移的源状态
  • to: 表示状态转移的目标状态
  • event: 表示触发状态转移的事件
  • ctx: 表示状态机的上下文对象

这个Action对象的逻辑是打印出一条信息,显示操作者、实体ID、源状态、目标状态和事件。例如:

frank is operating 123456 from:INIT to:PAID on:PAY_SUCCESS

这样可以方便地跟踪和调试状态机的运行情况。

2. 内部状态流转

内部过程描述:这个内部转换发生在PAID状态下,当发生DELIVERED_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态PAID

@Test
public void testInternalNormal(){
    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();

    builder.internalTransition()
            .within(OrderState.PAID)
            .on(OrderEvent.DELIVERED_SUCCESS)
            .when(checkCondition())
            .perform(doAction());

    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "1");

    OrderState target = stateMachine.fireEvent(OrderState.PAID, OrderEvent.DELIVERED_SUCCESS, new Order());
    assertEquals(OrderState.PAID, target);
}

3. 外部状态流转(多个起始状态)

外部过程描述:起始状态PAIDDELIVERED,结束状态REFUNDED,当发生REFUND_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态REFUNDED,否则返回对应起始状态文章来源地址https://www.toymoban.com/news/detail-449460.html

@Test
public void testExternalTransitionsNormal(){
    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();

    builder.externalTransitions()
            .fromAmong(OrderState.PAID, OrderState.DELIVERED)
            .to(OrderState.REFUNDED)
            .on(OrderEvent.REFUND_SUCCESS)
            .when(checkCondition())
            .perform(doAction());

    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "2");

    OrderState target = stateMachine.fireEvent(OrderState.PAID, OrderEvent.REFUND_SUCCESS, new Order());
    assertEquals(OrderState.REFUNDED, target);
}

4. 多个流转组合

@Test
public void testExternalInternalNormal(){
	StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();

	builder.externalTransition()...
	builder.internalTransition()...
	builder.externalTransition()...
	builder.externalTransitions()...

	StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "3");
}

五、相关链接

  1. 相关Maven引用地址:https://search.maven.org/search?q=g:com.alibaba.cola
  2. 实现一个状态机引擎,教你看清DSL的本质:https://blog.csdn.net/significantfrank/article/details/104996419
  3. 阿里开源COLA 4.0 - 项目实践:https://www.jianshu.com/p/6a00d6912f45
  4. COLA下的cola-statemachine状态机:https://www.jianshu.com/p/895047a04ae5

到了这里,关于COLA中的cola-statemachine状态机理解与使用例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cola4.0 - DDD 设计思想

    COLA提供了一整套代码架构,拿来即用。 其中包含了很多架构设计思想,包括讨论度很高的领域驱动设计DDD等。 COLA 的分层是一种经过改良的三层架构,主要是讲传统的业务逻辑层拆分为展示层、应用层、领域层和基础设施层。 展示层(Presentation Layer):负责以 Rest 的风格接

    2024年02月08日
    浏览(39)
  • 【架构设计】阿里开源架构Cola4.0的项目实践:订单系统

    使用SpringBoot+MybaitsPlus+Cola(整洁面向对象分层架构)4.0重构订单功能 Gitee:https://gitee.com/charles_ruan/smile-cola Github:https://github.com/charles0719/smile-cola 新增 POST http://localhost:8080/order/add 修改 POST http://localhost:8080/order/edit 访问详情 GET http://localhost:8080/order/1 分页查询 POST http://localho

    2024年02月14日
    浏览(50)
  • 在NLP中一下常见的任务,可以用作baseline;MRPC,CoLA,STS-B,RTE

    1.MRPC(Microsoft Research Paraphrase Corpus)任务 是一个用于文本匹配和相似度判断的任务。在MRPC任务中,给定一对句子,模型需要判断它们是否是语义上等价的。MRPC任务的训练集和测试集由约5700对英语句子组成。每个句子对都有一个二元标签,表示两个句子是否是语义上等价的。

    2024年02月08日
    浏览(41)
  • Spring Statemachine应用实践

     前言  在日常开发中经常遇到运营审核经销商活动、任务等等类似业务需求,大部分需求中状态稳定且单一无需使用状态机,但是也会出现大量的if...else前置状态代码,也是不够那么的“优雅”。随着业务的发展、需求迭代,每一次的业务代码改动都需要维护使用到状态的

    2024年02月04日
    浏览(36)
  • 一文详解Spring StateMachine的概念及应用

    Spring StateMachine是Spring官方提供的一个框架,供应用程序开发人员在Spring应用程序中使用状态机。支持状态的嵌套(substate)、状态的并行(parallel,fork,join)、子状态机等等。状态机可以帮助开发者简化状态控制的开发过程,使状态机结构更加层次化。 Spring StateMachine项目模

    2024年02月08日
    浏览(43)
  • 直流分量的产生与抑制机理

    直流分量的并网标准 理论上,逆变器只输出交流电,而实际上,电流中会夹杂着少量的直流分量,这些直流分量会对电网设备造成严重危害。随着新能源产业的迅猛发展,世界各国也随之陆续出台了诸多的相关技术要求 对于隔离型光伏并网系统中允许最大直流电流 :额定电

    2024年02月16日
    浏览(23)
  • 规模效应的几种形成机理

    一切要素都具有稀缺性,生产原料、机械、人力,包括数据要素由于必须有物质载体所以也是具有稀缺性的。在要素具有稀缺性的前提下,竞争是处理稀缺性的唯一方式。然而竞争的强度却不是普遍统一的,这也导致利润有相对高低之分。经济学理论对竞争强度与利润之间的

    2024年02月02日
    浏览(30)
  • 【spring6】解决循环依赖的机理

            循环依赖:A对象中有B属性。B对象中有A属性。比如:丈夫类Husband,妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。         解决:至少一个类采用set注入 + singleton模式。         原因:这种方式可以做到将“实例化Bean”和“给Bean属性赋值”这两个动作

    2024年04月26日
    浏览(30)
  • 电子元器件失效模式及失效机理汇总

    元器件 失效模式 失效机理 检测方法(待补充) 贴片电阻 开路 EOS电阻膜烧毁或大面积脱落; 外观检查/万用表阻抗测试; 基体受外力断裂; 高低温循环试验; 引线帽与电阻体脱落; X-Ray; 焊盘空焊/虚焊/假焊; 目视检查/AOI/电磁振动试验台/X-Ray(常见); 短路 银离子迁移; 断

    2023年04月08日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包