foolflow用思维组织代码

activiti&flowable任意驳回-获取可驳回节点信息 我们经常需要工作流中退回上一步,或者退回历史某一个节点。但由于流程的场景是很复杂的,回退有以下一些场景: 1.串行路线上的退回:流程中没有任何网关(排他网关/并行网关)和会签多实例。 2.退回到并行网关分支中的某一个节点上。 3.并行网关中的某一个分支节点上发起退回,退回到并行网关前面的某一个节点上。 4.子流程中退回到主干流程中某一个节点/主干流程退回到子流程中某一个节点。 我们都知道驳回的api: runtimeService.createChangeActivityStateBui.. 阅读详情

foolflow

经常遇到一种场景,整个业务涉及多个状态,每个环节涉及的业务可能由用户触发,可能同步或者异步的,或者可能是定时任务触发。代码散落在各个位置,而且文档丢失,想梳理整个流程的时候就无从下手。该组件就是解决这种痛点的

源码

https://gitee.com/cangjingge/foolflow

介绍

傻瓜工作流;放弃复杂设计,放弃bpmn规范,傻瓜式,足够简单;类似一个有限状态机,比状态机强,介于状态机和工作流之间。
在应对一些状态较多的简单场景,又不想引入繁重的工作流引擎的时候可以使用。不用学习bpmn规范,没有心智负担;使用后使代码条理性更强,整个业务的各个阶段的代码不再散落在项目的各个位置。方便管理

模型

在这里插入图片描述

由点node和line来组成一个工作流,整个流程驱动方式为通过当前节点+动作的方式进行驱动;支持单任务和批量任务;
业务逻辑通过ActionExecutor接口进行实现

使用方式
<dependency>
  <groupId>com.chungkui</groupId>
  <artifactId>foolflow</artifactId>
  <version>1.0</version>
</dependency>
使用说明

实现一下接口来写每个动作的逻辑

public interface ActionExecutor<S, A> {
    ActionResult execute(ActionContext actionContext, Node<S> from, Node<S> target, Line<S, A> line);
}

字符串驱动

 Flow flow = new FlowBuilder<String, String>().id("请假")
                .addNode("1", "填写请假表单")
                .addNode("2", "部门领导审批")
                .addNode("3", "中心领导审批")
                .addNode("4", "完成")
                .addLine("1", "2", "submit", "提交", submitFormAction)
                .addLine("2", "3", "yes", "同意", shenpiAction)
                .addLine("3", "4", "yes", "同意", shenpiAction)
                .addLine("3", "2", "no", "拒绝", shenpiAction).build();
        FlowEngine flowEngine = new DefaultFlowEngineImpl();

        flowEngine.work(flow, "3", "yes").getStatus().name()

枚举驱动

 Flow<StatusEnum, ActionEnum> flow = new FlowBuilder<StatusEnum, ActionEnum>().id("请假")
                .addNode(StatusEnum.S1, "填写请假表单")
                .addNode(StatusEnum.S2, "部门领导审批")
                .addNode(StatusEnum.S3, "完成")
                .addLine(StatusEnum.S1, StatusEnum.S2, ActionEnum.A1, "提交", submitfillform)
                .addLine(StatusEnum.S2, StatusEnum.S3, ActionEnum.A2, "同意", lingdaoshenp)
                .build();
        FlowEngine<StatusEnum, ActionEnum> flowEngine = new DefaultFlowEngineImpl();

         flowEngine.work(flow, StatusEnum.S1, ActionEnum.A1, new ActionContext())
        flowEngine.work(flow, StatusEnum.S2, ActionEnum.A2, new ActionContext())

其中的各个action动作就是你的业务代码;只需要实现ActionExecutor接口在execute中实现业务逻辑即可

public interface ActionExecutor<S, A> {
    ActionResult execute(ActionContext actionContext, Node<S> from, Node<S> target, Line<S, A> line);

}
spring 中使用

注册两个bean

     @Bean
       FlowContext flowContext() {
           return new SpringFlowContext();
       }
   
       @Bean
       FlowEngine flowEngine() {
           return new DefaultFlowEngineImpl(flowContext());
       }

注册动作执行器

@Service
public class TestActionImpl implements ActionExecutor {
    @Override
    public ActionResult execute(ActionContext actionContext, Node node, Node node1, Line line) {
        System.out.println(node.getName() + "-" + line.getName() + "->" + node1.getName());
        return DefaultActionResult.completed(actionContext,node1);
    }
}

注册流程实例

@Component
public class QingjiaFlow extends FlowFactoryBean {
    @Autowired
    ActionExecutor testActionImpl;
    @Override
    public Flow buildFlow() {
        return new FlowBuilder<String, String>().id("f1")
                .addNode("1", "填写请假表单")
                .addNode("2", "部门领导审批")
                .addNode("3", "中心领导审批")
                .addNode("4", "完成")
                .addLine("1", "2", "submit", "提交", testActionImpl)
                .addLine("2", "3", "yes", "同意", testActionImpl)
                .addLine("3", "4", "yes", "同意", testActionImpl)
                .addLine("3", "2", "no", "拒绝", testActionImpl).build();
    }
}
触发流程
 @Autowired
    FlowEngine flowEngine;
    @GetMapping(path = "/")
    public Object index(ModelMap map) {
        return flowEngine.work("qingjiaFlow","1","submit",null);
       }
一文带你完成ARMv8架构中的cache知识点 【摘要】 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处理器内核要复杂得多,其时钟速度可以快上几个数量级。但是,外部总线和内存设备的频率并没有扩大到同样的程度。有可能实现小块的片上SRAM,它可以以与内核相同的速度运行,但是与标准的DRAM块相比,这种RAM非常昂贵,因为后者的容量可以达到数千倍。在许多基于ARM处理器的系统中,访问外部存储器需要几十甚至几百个内核周期。 cache的技术背景 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处. 阅读详情

相关推荐

FR4板材实战:用ADS 2023快速设计微带线低通滤波器(附Line-Cal计算技巧)

本文详细介绍了使用ADS 2023在FR4板材上设计1-3GHz微带线低通滤波器的工程技巧。通过Line-Cal工具快速计算微带线参数,解决FR4板材的介质损耗和阻抗匹配问题,提供从集总参数转换到分布参数的实用方法,并分享版图设计与实测验证的关键要点,帮助工程师高效完成射频滤波器设计。

omega的博客 713

手写工作流设计模式,针对常见的工作流步骤流转,减少过多的if/else,提升编程思维

这一年下来,写两次工作流流转,总结下经验。第一次写的时候,只找到用模版设计模式包裹一下,每个方法都做隔离,但是在具体分支实现的时候,if/else 满屏分,而且因为要针对不同情况,重复代码很多,但是if/else的条件又不一样,搞得我没办法用设计模式修改,想过用工厂模式重构。一是没时间,二是工厂模式和策略模式基本上都用不来,首先,工厂模式一定是if else分支较多,并且入参明确、固定。策略模式也是不同的方法,实现不同的业务,入参明确、固定。

hikktn的博客 2841

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4043

Solon Ai Flow 编排开发框架发布预告(效果预览)

Solon Ai 在推出 Solon Ai Mcp 后,又将推出 Solon Ai Flow。

weixin_37083614的博客 62

【SWPUCTF 2021 新生赛】hardrce

对每个字符的ASCII值进行按位取反操作(这种要进行自增马进行绕过。

XiaoHei的博客 460

VMware系列:此平台不支持虚拟化 Intel-VT-x/EPT 或 AMD-V/RVI

VMware系列:此平台不支持虚拟化 Intel-VT-x/EPT 或 AMD-V/RVI

weixin_54626591的博客 1万+

带着问题看源码7-NodeRed中的context模块

1. 此模块的意义 NodeRed context 模块是运行期做数据保存及共享的一种机制。当节点间有相同内容时,可以考虑将相同的内容放入 context 以实现共享,既减少了空间,也有利于修改。 2. NodeRed 此模块功能 context 有三类:global、flow、node,其中 global 是随着 context 模块初始化时创建,全局唯一;flow context 以 flowId 为标识,为所有具有相同 flowId 的节点做记录;node context 以 flow:id 为标识。

lxmuyu的专栏 2371

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 170

22.状态模式

状态模式 状态模式:就是状态会根据流程来变化,例如工作中常见的工作流(请假申请)等; Context:这里面存放了整个流程状态的属性,还有一个流程启动方法; State:定义一个流程执行方法,并依赖Context,每个流程节点都必须实现该接口,这样当流程到这个节点时,就能拿到当前的流程状态(Context); /** * 流程控制 * */ public class FlowContext { private boolean flag; // 代表流程是否结束 /**

lq6812574的博客 207

Altium Designer(AD24/25)PCB编辑的几种方法介绍

本文介绍了Altium Designer(AD24/25)软件中PCB编辑的四种操作方法:1)通过菜单栏"Place→Component"激活;2)点击工具栏元器件图标;3)右键快捷菜单选择;4)快捷键P+C组合操作。建议初学者先通过菜单栏和快捷菜单熟悉操作,熟练后转为工具栏和快捷键以提高效率。文章配有操作示意图,帮助用户快速掌握PCB元器件放置技巧。

fydar的博客 943

Imagiq AI-PQ 图像质量增强模块详解:联发科 ISP 中的 AI 图像管线实战解析

随着智能手机影像系统对图像质量要求的持续提升,联发科在其 Imagiq ISP 中引入了 AI 驱动的图像增强模块——AI-PQ(AI-based Picture Quality),通过 AI 模型对亮度、色彩、噪声、锐度等多个维度进行动态调节与增强,实现更加智能化和个性化的图像输出效果。AI-PQ 在实际工程中已成为影响照片风格、视频观感和多模组一致性的核心能力之一。本文围绕 Imagiq 平台最新一代 AI-PQ 模块(2024-2025年量产平台为基础),结合实机开发与调优经验,深入剖析其各子模块的算

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1420

oozie学习笔记

oozie远程触发一个工作,一个工作完成之后,返回oozie知行下一个 oozie是以DAG的形式执行,前一个执行完,下一个才能执行!   可以在工作流中使用参数化形式定义参数类似${inputDir}的形式,在提交工作时必须提供参数! Oozie workflows contain control flow nodes and action nodes. 工作流,包括控制流节点(con

CSLDBLYDX的专栏 1036

30天入门 SAP BTP 开发系列之八:动手在 SAP BTP 上开发第一个 ABAP 透明表

ABAP Cloud 环境下创建透明表的方法与数据迁移实践 本文介绍了在 SAP BTP ABAP 环境中创建透明表并迁移数据的完整流程。与传统的 SE11 事务码不同,ABAP Cloud 需通过 ABAP Development Tool 创建数据库表,使用代码定义表结构。作者详细演示了如何: 在开发包中创建名为 Z优快云_TRAVEL 的透明表 使用 ABAP 代码定义表字段和约束 通过 ABAP 类实现数据从标准表/DMO/TRAVEL 到新建表的迁移 验证数据迁移结果 文中还提供了相关技术概念的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1785

WFP开发学习笔记

通过WFP获取、修改、放行、拦截数据

心碎瞬间的博客 8075

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

工作流Flowable实战 (六)自定义身份

文章目录一、重写Flowable接口二、自定义审核人1、前端增加选项1、后端监听 一、重写Flowable接口 系统中肯定有自己的一套用户,而flowable默认用户和用户组无法和自己系统中的用户统一,所以重写floeable用户和用户组接口,让flowable直接查自己的用户数据。 EditorUsersResource,EditorGroupsResource 二、自定义审核人 1、前端增加选项 flowable默认有分配给流程发起人,想自定义一个分配给流程发起人上级领导,如何实现。 修改flo

sql_cc的博客 5570

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

工作流Flowable实战 (三)流程相关操作

文章目录一、开始流程一、流程操作 一、开始流程 // 开始流程 identityService.setAuthenticatedUserId(userId); try { runtimeService.startProcessInstanceById(processDefinitionId, businessKey, variables); } catch (Exception e) { e.printStackTrace(); throw new FlowableException("流程启动失败

sql_cc的博客 1027

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

协程三部曲之③:Flow 的使用!

Hi,大家好,这里是承香墨影!今天继续给大家分享来自作者「九心」 Kotlin 的协程系列的第三篇。Google 一直在推 Kotlin,在 Android Jetpack 中也是使用 K...

承香墨影的博客 2801

5、异步流(Asynchronous Flow)

异步流 一个suspend函数异步的返回一个值,但是我们怎么返回多个异步计算的值呢?这就是kotlin流(Flows)存在的理由。 1、多个值的表示 在kotlin中可以使用集合collections来表示多个值,比如我们有个simple函数用于返回一个包含3个值的List,然后使用forEach把他们打印出来,代码如下: package com.cool.cleaner.test fun simple(): List<Int> = listOf(1, 2, 3) fun m..

1557

wfp网络过滤框架总结(一)

一、基本术语定义 callout为扩展wfp性能提供的一个功能,由一系列call function和一个guid key组成,wfp内置了几个callouts。用户可以通过callout drivers自己添加callout。 callout driver实现一个或者多个callouts的内核驱动,这个驱动通过向filter engine注册callouts,来通知filter engine当...

zhangge3663的博客 5158

设计模式之状态模式

模式简介 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类,(State Pattern)是设计模式的一种,属于行为模式。 定义 (源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不

漫长学习路 5768

Windows8核心态网络过滤研究

Windows 8是微软公司推出的最新的客户端操作系统,内部名称Windows NT 80。相对于Windows NT 5.x,其网络结构变化非常大,原有的TDI,NDIS系统挂接方法不再适用。在Windows8系统中,微软引入了两种新的网络过滤系统,WFP和NDISfilter。WFP (Windows Filtering Platform)其包含从用户态到核心态的一系列应用层,根据需...

weixin_30355437的博客 455

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 288

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 129

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 499
上一篇: rocketMq源码启动
下一篇: jdk1.7中hashMap扩容导致死循环问题原因分析
掀衣怒码
博客等级 码龄6年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值