首页 > 其他分享 >阿里相关组件-阿里Cola状态机相关

阿里相关组件-阿里Cola状态机相关

时间:2023-08-21 22:44:06浏览次数:47  
标签:状态 private class 状态机 阿里 cola public Cola

使用

State:状态
Event:事件,状态由事件触发,引起变化
Transition:流转,表示从一个状态到另一个状态
External Transition:外部流转,两个不同状态之间的流转
Internal Transition:内部流转,同一个状态之间的流转
Condition:条件,表示是否允许到达某个状态
Action:动作,到达某个状态之后,可以做什么
StateMachine:状态机
<dependency>
   <groupId>com.alibaba.cola</groupId>
   <artifactId>cola-component-statemachine</artifactId>
   <version>4.1.0</version>
</dependency>
import com.alibaba.cola.statemachine.Action;
import com.alibaba.cola.statemachine.Condition;
import com.alibaba.cola.statemachine.StateMachine;
import com.alibaba.cola.statemachine.builder.StateMachineBuilder;
import com.alibaba.cola.statemachine.builder.StateMachineBuilderFactory;
import lombok.Data;

public class TestColaStatemachine {
    public static void main(String[] args) {
        // 第一步:生成一个状态机builder
        StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();
        // 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform
        builder.externalTransition()
                .from(States.STATE1)
                .to(States.STATE2)
                .on(Events.EVENT1)
                .when(new MyCondition())
                .perform(new MyAction()); //这个action 我们可以按自己所需修改,比如这种Action<R,T> service的方法Service::method

        // 第三步:设置状态机的id和ready,并在StateMachineFactory中的stateMachineMap进行注册
        StateMachine<States, Events, Context> stateMachine = builder.build(MACHINE_ID);
        // 第四步:触发状态机
        States target = stateMachine.fireEvent(States.STATE1, Events.EVENT1, new Context());
        System.out.println(target);
    }

    private static String MACHINE_ID = "TestStateMachine";
    
    static class MyCondition implements Condition<Context> {
        @Override
        public boolean isSatisfied(Context context) {
            return true;
        }
    }

    static class MyAction implements Action<States, Events, Context> {
        @Override
        public void execute(States from, States to, Events event, Context context) {
            System.out.println("from: " + from);
            System.out.println("to: " + to);
            System.out.println("event: " + event);
            System.out.println("context: " + context);
        }
    }

    enum States {
        STATE1, STATE2, STATE3, STATE4
    }

    enum Events {
        EVENT1, EVENT2, EVENT3, EVENT4, INTERNAL_EVENT
    }

    @Data
    static class Context {
        String operator = "frank";
        String entityId = "123465";
    }
}

原理

核心类

  1. StateMachine 状态机
public class StateMachineImpl<S, E, C> implements StateMachine<S, E, C> {
    private String machineId;
    private final Map<S, State<S, E, C>> stateMap;//核心字段,保存所有状态
}

S:state 我们自己项目中的状态类
E:Event 我们自己的事件类
C:Context 我们自己的上下文

  1. State 状态
public class StateImpl<S,E,C> implements State<S,E,C> {
    protected final S stateId;
    private EventTransitions eventTransitions = new EventTransitions();//
}
  1. EventTransitions 关于Transition的一个包装
public class EventTransitions<S,E,C> {
    private HashMap<E, List<Transition<S,E,C>>> eventTransitions;

    public EventTransitions(){
        eventTransitions = new HashMap<>();
    }
  1. Transition 流转
public class TransitionImpl<S,E,C> implements Transition<S,E,C> {
    private State<S, E, C> source; //源状态
    private State<S, E, C> target; //目标状态
    private E event;               //事件
    private Condition<C> condition;//判断条件
    private Action<S,E,C> action;  //流转到目标状态后的操作
    private TransitionType type = TransitionType.EXTERNAL;//内部还是外部

内部:统一状态
外部:不同状态

参考

COLA下的cola-statemachine状态机
管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程

标签:状态,private,class,状态机,阿里,cola,public,Cola
From: https://www.cnblogs.com/strongmore/p/17131274.html

相关文章

  • 从头配置阿里云服务器
    哈喽,大家早上好,愉快的一天又开始了。今天我们就不去抠繁琐的源码和枯燥的原理了,跟大家聊点轻松愉快的话题。心血来潮去年双十一的时候,趁着搞活动买了台阿里云服务器。想着以后自己可以折腾一下,搭建个博客或者搞个小服务玩玩,但是买完之后就把计划搁置了。前几周突然想起来之前搞过一......
  • 【故障公告】会员救园,阿里云故障
    今天19:09通过微信服务号发布了会员救园的文章,满怀期待地等着会员降临时,却收到好几位用户的私信,反馈说https://cnblogs.vip/网站打不开。当时很是纳闷,会员站点自上线以来从来没有出过问题,怎么这么巧,一发公众号就出现问题,真会找时间添乱。排查后万万没有想到竟然是会员站点所......
  • fastadmin安装阿里云短信插件
    1、前置条件安装fastadmin插件,需要先安装好fastadmin框架,如何安装fastadmin框架,可以查看这个地址https://www.fastadmin.net/video.html2、安装阿里云短信插件找到插件管理然后点击本地安装上传本地阿里云短信插件安装成功......
  • 阿里云短信服务
    1、阿里云短息服务注册阿里云官网:https://www.aliyun.com/①进入短信服务②免费开通 ③选择国内消息–>签名管理–>添加签名 签名内容 ④添加模版⑤安全设置、发送频率设置⑥账户充值 ⑦AccessKey管理  2、Java代码引入①导入依赖包<dependenc......
  • java实现本地数据与阿里云MySQL数据同步:动态表创建与数据更新
    在开发应用程序时,经常需要将数据从一个数据源(如API、外部数据库等)同步到本地数据库中。这可能涉及到不同的表结构和数据模式。在这种情况下,一个主要的挑战是,如果本地数据库中的表结构与源数据不匹配,应该如何自动适应这些变化并确保数据同步的顺利进行。解决方案:动态表创建与数据......
  • 申请部署阿里云SSL免费证书
    使用宝塔自动创建的证书有时候会报NET::ERR_CERT_COMMON_NAME_INVALID,并且每次只能三个月,需要点击续期非常麻烦,容易遗忘。阿里云免费SSL证书前往阿里云管理控制台【数字证书管理服务】【SSL证书】,每年20个额度,一年后会过期失效填写申请的域名申请成功后,刷新列表页面,可以看到下......
  • docker commit本地镜像发布至阿里云服务器
    一、镜像构成docker镜像文件是一层一层构建好的dokerpulltomcat拉取镜像时会发现docker镜像时一层层的下载dockerhistorytomcat 可以查看镜像构建的历史信息二、UnionFS文件系统UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件......
  • 如何用java将本地redis 中所有类型数据同步到阿里云redis中
    在分布式系统中,数据同步是一个重要的任务,特别是在将数据从一个Redis实例同步到另一个Redis实例的情况下。本篇博客将介绍如何使用Java编程语言以及Jedis(JavaRedis客户端)库来实现将本地Redis中的所有类型数据同步到阿里云Redis实例中。核心代码importredis.client......
  • 阿里云不同主体账号合并ECS主机资源迁移记录
    迁移记录需求A账号和B账号是不同的阿里云认证主体,要求A账号下的资源要迁移到B账号下,方便统一管理。A账号资源vpc:10.0.0.0/8B账号资源vpc:172.16.0.0/12A账号和B账号已做了vpc对等连接。操作步骤1.A账号:修改A账号的认证主体为B账号的认证主体,否则不能进行迁移......
  • 阿里云OSS图片上传和显示注意点
    1.java.lang.IllegalArgumentException:Theobjectkey"/image-业务名称/20230818/20230818-订单号参数-accident.jpg"isinvalid.Anobjectnameshouldbebetween1-1023byteslongwhenencodedasUTF-8andcannotcontainLForCRorunsupportedcharsinX......