当前位置: 首页 > article >正文

开源状态机引擎,在实战中可以放心使用

### Squirrel-Foundation 状态机开源项目介绍

**Squirrel-Foundation** 是一个轻量级、灵活、可扩展、易于使用且类型安全的 Java 状态机实现,适用于企业级应用。它提供了多种方式来定义状态机,包括注解声明和 Fluent API,并且支持状态转换、状态动作、上下文传递等功能。

#### GitHub 地址
- **项目地址**:[https://github.com/hekailiang/squirrel](https://github.com/hekailiang/squirrel)

#### 使用说明

##### 1. 添加依赖
Squirrel-Foundation 已发布到 Maven 中央仓库,可以通过以下方式添加依赖:
- **最新发布版本**:
    ```xml
    <dependency>
        <groupId>org.squirrelframework</groupId>
        <artifactId>squirrel-foundation</artifactId>
        <version>0.3.10</version>
    </dependency>
    ```
- **最新快照版本**:
    ```xml
    <dependency>
        <groupId>org.squirrelframework</groupId>
        <artifactId>squirrel-foundation</artifactId>
        <version>0.3.11-SNAPSHOT</version>
    </dependency>
    ```

##### 2. 快速开始
以下是一个简单的示例代码,展示如何创建和使用状态机:
```java
public class QuickStartSample {
    // 定义状态机事件
    enum FSMEvent {
        ToA, ToB, ToC, ToD
    }

    // 定义状态机类
    @StateMachineParameters(stateType = String.class, eventType = FSMEvent.class, contextType = Integer.class)
    static class StateMachineSample extends AbstractUntypedStateMachine {
        protected void fromAToB(String from, String to, FSMEvent event, Integer context) {
            System.out.println("Transition from '" + from + "' to '" + to + "' on event '" + event +
                    "' with context '" + context + "'.");
        }

        protected void ontoB(String from, String to, FSMEvent event, Integer context) {
            System.out.println("Entry State '" + to + "'.");
        }
    }

    public static void main(String[] args) {
        // 构建状态转换
        UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(StateMachineSample.class);
        builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).callMethod("fromAToB");
        builder.onEntry("B").callMethod("ontoB");

        // 使用状态机
        UntypedStateMachine fsm = builder.newStateMachine("A");
        fsm.fire(FSMEvent.ToB, 10);

        System.out.println("Current state is " + fsm.getCurrentState());
    }
}
```

##### 3. 定义状态机
Squirrel-Foundation 支持通过 Fluent API 和注解声明两种方式定义状态机:
- **Fluent API**:
    ```java
    builder.externalTransition().from(MyState.A).to(MyState.B).on(MyEvent.GoToB);
    ```
- **注解声明**:
    ```java
    @States({
        @State(name = "A", entryCallMethod = "entryStateA", exitCallMethod = "exitStateA"),
        @State(name = "B", entryCallMethod = "entryStateB", exitCallMethod = "exitStateB")
    })
    @Transitions({
        @Transit(from = "A", to = "B", on = "GoToB", callMethod = "stateAToStateBOnGotoB"),
        @Transit(from = "A", to = "A", on = "WithinA", callMethod = "stateAToStateAOnWithinA", type = TransitionType.INTERNAL)
    })
    interface MyStateMachine extends StateMachine<MyStateMachine, MyState, MyEvent, MyContext> {
        void entryStateA(MyState from, MyState to, MyEvent event, MyContext context);
        void stateAToStateBOnGotoB(MyState from, MyState to, MyEvent event, MyContext context);
        void stateAToStateAOnWithinA(MyState from, MyState to, MyEvent event, MyContext context);
        void exitStateA(MyState from, MyState to, MyEvent event, MyContext context);
    }
    ```

##### 4. 高级特性
- **转换扩展方法**:可以在状态转换时扩展自定义逻辑。
    ```java
    protected void afterTransitionCompleted(S fromState, S toState, E event, C context) {
        // 自定义逻辑
    }
    ```
- **异步事件处理**:通过 `@AsyncExecute` 注解可以将事件处理逻辑异步执行。
    ```java
    public class DeclarativeListener {
        @OnTransitionBegin
        @AsyncExecute
        public void onTransitionBegin(...) {
            // 异步处理逻辑
        }
    }
    ```

##### 5. 与其他框架集成
Squirrel-Foundation 可以与 Spring 框架集成,通过注册一个后处理器来自动注入依赖:
```java
@Component
public class StateMachineAutowireProcessor implements SquirrelPostProcessor<StateMachine>, ApplicationContextAware {
    private ApplicationContext applicationContext;

    public StateMachineAutowireProcessor() {
        SquirrelPostProcessorProvider.getInstance().register(StateMachine.class, this);
    }

    @Override
    public void postProcess(StateMachine stateMachine) {
        AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
        autowireCapableBeanFactory.autowireBean(stateMachine);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
```

更多使用细节和高级特性可以参考 [Squirrel-Foundation 官方文档](https://hekailiang.github.io/squirrel/) 或其 [GitHub 仓库](https://github.com/hekailiang/squirrel)。

相关文章:

开源状态机引擎,在实战中可以放心使用

### Squirrel-Foundation 状态机开源项目介绍 **Squirrel-Foundation** 是一个轻量级、灵活、可扩展、易于使用且类型安全的 Java 状态机实现&#xff0c;适用于企业级应用。它提供了多种方式来定义状态机&#xff0c;包括注解声明和 Fluent API&#xff0c;并且支持状态转换、…...

机器学习超参数优化全解析

机器学习超参数优化全解析 摘要 本文全面深入地剖析了机器学习模型中的超参数优化策略&#xff0c;涵盖了从参数与超参数的本质区别&#xff0c;到核心超参数&#xff08;如学习率、批量大小、训练周期&#xff09;的动态调整方法&#xff1b;从自动化超参数优化技术&#xf…...

AI 模型在前端应用中的典型使用场景和限制

典型使用场景 1. 智能表单处理 // 使用TensorFlow.js实现表单自动填充 import * as tf from tensorflow/tfjs; import { loadGraphModel } from tensorflow/tfjs-converter;async function initFormPredictor() {// 加载预训练的表单理解模型const model await loadGraphMod…...

Linux学习——UDP

编程的整体框架 bind&#xff1a;绑定服务器&#xff1a;TCP地址和端口号 receivefrom()&#xff1a;阻塞等待客户端数据 sendto():指定服务器的IP地址和端口号&#xff0c;要发送的数据 无连接尽力传输&#xff0c;UDP:是不可靠传输 实时的音视频传输&#x…...

leetcode205.同构字符串

两个哈希表存储字符的映射关系&#xff0c;如果前面字符的映射关系和后面的不一样则返回false class Solution {public boolean isIsomorphic(String s, String t) {if (s.length() ! t.length()) {return false;}int length s.length();Map<Character, Character> s2…...

软考软件设计师考试情况与大纲概述

文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1&#xff1a;计算机与软件工程知识****科目2&#xff1a;软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理&#xff0c;并…...

24. git revert

基本概述 git revert 的作用是&#xff1a;撤销某次的提交。与 git reset 不同的是&#xff0c;git revert 不会修改提交历史&#xff0c;而是创建一个新的提交来反转之前的提交。 基本用法 1.基本语法 git revert <commit-hash>该命令会生成一个新的提交&#xff0c…...

Redis—内存淘汰策略

记&#xff1a;全体LRU&#xff0c;ttl LRU&#xff0c;全体LFU&#xff0c;ttl LFU&#xff0c;全体随机&#xff0c;ttl随机&#xff0c;最快过期&#xff0c;不淘汰&#xff08;八种&#xff09; Redis 实现的是一种近似 LRU 算法&#xff0c;目的是为了更好的节约内存&…...

Java大厂面试:JUC锁机制的深度探讨 - 从synchronized到StampedLock

Java大厂面试&#xff1a;JUC锁机制的深度探讨 在一个风和日丽的下午&#xff0c;马飞机同学来到了一家互联网大厂参加Java开发岗位的面试。这次他面对的是严肃且专业的面试官李老师&#xff0c;而话题则围绕着Java并发编程中的重要组成部分——JUC&#xff08;java.util.conc…...

NLP高频面试题(五十一)——LSTM详解

长短期记忆网络(LSTM)相较于传统循环神经网络(RNN)的核心改进在于通过引入记忆单元(cell state)和门机制(gating mechanism)来有效缓解梯度消失与梯度爆炸问题,从而更好地捕捉长距离依赖关系 。在其网络结构中,信息通过输入门(input gate)、遗忘门(forget gate)和…...

Power BI企业运营分析——数据大屏搭建思路

Power BI企业运营分析——数据大屏搭建思路 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 整合多源数据&#xff0c;实时监控关键指标&#xff0c;精准分析业务&#xff0c;快速识别问题机遇。其可视化看…...

oracle将表字段逗号分隔的值进行拆分,并替换值

需求背景&#xff1a;需要源数据变动&#xff0c;需要对历史表已存的字段值根据源数据进行更新。如果是单字段存值&#xff0c;直接根据映射表关联修改即可。但字段里面若存的值是以逗号分割&#xff0c;比如旧值&#xff1a;‘old1,old2,old3’&#xff0c;要根据映射关系调整…...

【重走C++学习之路】16、AVL树

目录 一、概念 二、AVL树的模拟实现 2.1 AVL树节点定义 2.2 AVL树的基本结构 2.3 AVL树的插入 1. 插入步骤 2. 调节平衡因子 3. 旋转处理 4. 开始插入 2.4 AVL树的查找 2.5 AVL树的删除 1. 删除步骤 2. 调节平衡因子 3. 旋转处理 4. 开始删除 结语 一、概念 …...

NumPy进阶:广播机制、高级索引与通用函数详解

目录 一、广播机制&#xff1a;不同形状数组间的运算 1. 概念 2. 广播规则 3. 实例 二、高级索引&#xff1a;布尔索引与花式索引 1. 布尔索引 &#xff08;1&#xff09;创建布尔索引 &#xff08;2&#xff09;布尔索引的应用 2. 花式索引 &#xff08;1&#xff0…...

597页PPT丨流程合集:流程梳理方法、流程现状分析,流程管理规范及应用,流程绩效的管理,流程实施与优化,流程责任人的角色认知等

流程梳理是通过系统化分析优化业务流程的管理方法&#xff0c;其核心包含四大步骤&#xff1a;①目标确认&#xff0c;明确业务痛点和改进方向&#xff1b;②现状分析&#xff0c;通过流程图、价值流图还原现有流程全貌&#xff0c;识别冗余环节和瓶颈节点&#xff1b;③优化设…...

[密码学基础]GMT 0029-2014签名验签服务器技术规范深度解析

GMT 0029-2014签名验签服务器技术规范深度解析 引言 在数字化转型和网络安全需求激增的背景下&#xff0c;密码技术成为保障数据完整性与身份认证的核心手段。中国密码管理局发布的GMT 0029-2014《签名验签服务器技术规范》&#xff0c;为签名验签服务器的设计、开发与部署提…...

Kinibi-610a:面向芯片厂商与设备制造商的TEE升级详解

安全之安全(security)博客目录导读 目录 一、TEE内存管理革新 二、TA加载架构优化 三、系统日志(syslog)集成 四、加密日志支持 五、工具链升级至Python3 六、总结与展望 七、参考资料 Trustonic最新发布的可信执行环境(TEE)Kinibi-610a,在前代Kinibi-600多平台支…...

来啦,烫,查询达梦表占用空间

想象一下oracle&#xff0c;可以查dba_segments&#xff0c;但是这个不可靠&#xff08;达梦官方连说明书都没有&#xff09; 先拼接一个sql set lineshow off SELECT SELECT ||||OWNER|||| AS OWNER,||||TABLE_NAME|||| AS TABLE_NAME,TABLE_USED_SPACE(||||OWNER||||,||||T…...

vue3:十一、主页面布局(修改左侧导航条的样式)

一、样式 1、初始样式 2、 左侧导航栏搭建完成样式 二、实现 1、设置左侧导航栏底色 (1)去掉顶部和左侧导航栏的底色 初始页面效果 顶部与左侧底色样式 将代码中与顶部与左侧的样式删掉 移除后页面效果 加入设定背景色 #f4f6f9 加入底色后颜色展示 (2)去除菜单项底色 初…...

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...

Sentinel源码—7.参数限流和注解的实现二

大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 2.SentinelResource注解的使用和实现 (1)SentinelResource注解的使用 (2)SentinelResource注解和实现 (1)SentinelResource注解的使用 一.引入Sentinel Spring Boot Starter依赖 <dependency><…...

操作系统原理简要介绍

文章目录 计算机启动的底层流程&#xff08;从裸机到操作系统&#xff09;内核用户态与内核态内核分类 进程与线程&#xff1a;操作系统的 “执行者”内存管理&#xff1a;数据的“存储与调度”文件系统&#xff1a;数据的“组织与持久化”设备驱动&#xff1a;硬件的“翻译官”…...

QML ShaderEffect(着色器效果)组件

ShaderEffect 是 QML 中用于实现自定义着色器效果的组件&#xff0c;允许开发者使用 GLSL 着色器语言创建图形效果。 核心属性 基本属性 属性类型默认值说明fragmentShaderstring""片段着色器代码vertexShaderstring""顶点着色器代码blendingbooltrue是…...

2.6 递归

递归 特性&#xff1a; >.一递一归 >.终止条件 一般为&#xff1a;0 1 -1 #测试函数的返回值为函数 def test_recursion():return test_recursion() print(test_recursion()) RecursionError: maximum recursion depth exceeded #案例&#xff1a;计算 …...

麒麟系统网络连接问题排查

麒麟系统网络连接有红色叹号,不能上外网 了。 首先执行 ping -c4 8.8.8.8 和 nc -zv 8.8.8.8 53,如果 都能正常通信,说明你的网络可以访问公共 DNS 服务器(如 Google DNS 8.8.8.8),但域名解析仍然失败,可能是 DNS 解析配置问题 或 系统 DNS 缓存/代理干扰。以下是进一步…...

opencv(双线性插值原理)

双线性插值是一种图像缩放、旋转或平移时进行像素值估计的插值方法。当需要对图像进行变换时&#xff0c;特别是尺寸变化时&#xff0c;原始图像的某些像素坐标可能不再是新图像中的整数位置&#xff0c;这时就需要使用插值算法来确定这些非整数坐标的像素值。 双线性插值的工…...

从信号处理角度理解图像处理的滤波函数

目录 1、预备知识 1.1 什么是LTI系统? 1.1.1 首先来看什么是线性系统,前提我们要了解什么是齐次性和叠加性。...

echarts模板化开发,简易版配置大屏组件-根据配置文件输出图形和模板(vue2+echarts5.0)

实现结果 项目结构 根据我的目录和代码 复制到项目中 echartsTemplate-echarts图形 pie实例 <template><div :id"echartsId"></div> </template> <script> export default {name: ,components: {},mixins: [],props: [echartsId,…...

从人工到智能:外呼系统如何重构企业效率新生态

在数字化转型的浪潮中&#xff0c;智能外呼系统正从边缘辅助工具演变为企业效率革命的核心引擎。根据Gartner最新调研数据&#xff0c;部署AI外呼系统的企业客服效率平均提升68%&#xff0c;销售线索转化率增长42%。但在这场技术驱动的变革中&#xff0c;真正决定成败的往往不是…...

HTTP 2.0 和 3.0 的区别

HTTP 2.0 和 3.0 的核心区别体现在底层协议设计、性能优化和网络适应性上&#xff0c;以下是具体对比&#xff1a; 一、核心区别对比 特性HTTP 2.0HTTP 3.0&#xff08;HTTP/3&#xff09;底层传输协议TCPUDP&#xff08;基于 QUIC 协议&#xff09;队头阻塞&#xff08;TCP …...