Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
B

bulbasaur

> 编程语言
Open source

A pluggable, scalable process engine. You can use it to develop business-process, approval-process, retry-process and so on. Hope you enjoy it! 可插拔的精简流程引擎

755 stars0 likes1 views
WebsiteGitHub

About

A pluggable, scalable process engine. You can use it to develop business-process, approval-process, retry-process and so on. Hope you enjoy it! 可插拔的精简流程引擎

轻量级流程引擎

Bulbasaur 读音 ['bʌlba:sɑu]


Bulbasaur QuickStart

简介

bulbasaur分为四个模块,按需加载使用。分别为:

模块 功能
核心模块 bulbasaur-core 提供核心流程
持久化模块 bulbasaur-persist 提供流程的存储和失败回滚
调度模块 bulbasaur-schedule 提供失败重试,定时等调度逻辑
任务模块 bulbasaur-task 提供人工任务和超时自动执行,目前已经支持单人单任务,多人单任务

概述

  • 如果你只是希望使用基于内存的流程引擎,那么只要使用核心模块即可,流程模板以文件形式维护在业务方系统。
  • 如果希望流程引擎有持久化的流程实例和节点,那么要使用 核心模块 + 持久化模块。
  • 如果希望流程引擎有节点失败重试,定时等功能,那么要使用核心模块 + 持久化模块 + 调度模块。
  • 如果希望任务审批,多人审批的能力,那么要使用核心模块 + 持久化模块 + 任务模块 ,至于要不要调度模块都可以。

其中,除了核心模块外,其他模块都需要业务方建表支持。

持久化模块 bulbasaur-persist 需要表:

表名 功能
xx_bulbasaur_d 模板
xx_bulbasaur_p 流程实例
xx_bulbasaur_s 节点

调度模块bulbasaur-schedule需要表:

表名 功能
xx_bulbasaur_j 重试/定时 任务

任务模块bulbasaur-task需要表:

表名 功能
xx_bulbasaur_t 审批任务
xx_bulbasaur_ptp 多人审批任务

以上表需要建在业务方库中,表名可以业务方指定,流程引擎可以识别,比如:业务方库中表都有统一前缀,那么流程引擎表可以都带上统一前缀。

流程引擎使用quartz做分布式调度,也需要在业务方库中建表。

注意: 建表语句文末提供

在项目中引入bulbasaur配置,最全配置如下(业务方根据引人模块酌情配置)

xml

    
    

    
    
    
    
    
    
    
    
    
    

    
    
    
    

    
        
            
            
            
            
        
    

 

        
        

 

      
    
        
    

      
      
    
    
    
    
    
    
    

代码中使用

java
try {
    //基于内存的流程
    //Machine m = machineFactory.newInstance("业务唯一id","流程名称xxx");
    //持久化流程
    //PersistMachine m = persistMachineFactory.newInstance("业务唯一id","流程名称xxx");
    //可调度流程
    ScheduleMachine m = scheduleMachineFactory.newInstance("业务唯一id", "流程名称xxx");

    m.addContext("goto", 2);// 可放入流程中的变量,上文中可用
    m.addContext("_i", 3);// 会被持久化的流程变量,因为带了  "_" 开头
    m.run();
} catch (Exception e) {
    System.out.println(e);
}

功能节点介绍

节点 功能
start 特殊开始节点
state 直接执行invokes内容,并根据paths中配置执行下一个节点,如果配置了多个path,则可以根据表达式判断走哪条
event 先执行pre-invokes,并暂停。需要外部再次触发,继续执行invokes 。其中 pre-invokes 和invokes 按需不配置
task 审批流节点,可以在节点上直接配置审批人列表,或者配置服务从业务方获取审批人列表

流程模板示例(本例子比较全,业务方可以按需使用)

xml

    
        
    

    
        
        
    

 
        
            

        
        
             

        
        
            
            
        
    

    
    
        

    
    
        
    

    
    
        

    
    
        

    
    
    
        

    

    
    
    
    

    
        
    

    
        
    

相关重点说明

关于调度依赖分布式quartz

流程引擎使用了quartz,通过数据库完成分布式调度。配置:quartz.xml

系统内存在的调度处理逻辑:

  1. bulbasaurJobProcessor
    任务读取的频率为每30s一次,那么流程引擎中 "失败重试","定时","超时"等逻辑,最小时间单位就是30s
    使用人员可以根据业务情况自行修改减小频率
  2. bulbasaurCleanerTrigger
    清理已经完成的流程和其所关联的节点以及job,如果不需要,可以直接在配置中删除触发
  3. bulbasaurJobCleanerTrigger
    单独清理已经完成的job数据,如果不需要,可以直接在配置中删除触发

关于重试

repeatList="1m 2m 3m 2m 1m",支持分(m),小时(h)和天(d),该示例意思为:重试5次,每次间隔分别为1分钟,2分钟,3分钟...

task节点

  1. pre-invokes 该配置,业务方可以配置bean,接收参数为string,逗号分割的taskId,业务可以处理该task,给用户发旺旺消息,邮件等审核链接。
  2. candidate-users 可配置列表,: ,分割,例如00001:测试人员,00002:初审人员。
  3. assignment-handler 配置获得处理人,业务bean返回的格式同。candidate-users,这里bulbasaur只关注id和name,业务系统自行对接hecla或uic或subaccount。其中 assignment-handler 获取的内容优先级高于candidate-users。
  4. 如果 candidate-users没有配置,并且assignment-handler返回null,则任务该任务节点不需要审核,直接往下走。
  5. timeout-handler配置超时的策略,业务bean返回给bulbasaur一个Map,key分别为:period[超时时间],outGoing[超时之后去到的节点名],ignoreWeekend[是否忽略周末]。

任务处理接口

  • TaskAccessor.hasTaskTakenPermission
    判断用户是否有权限申领指定的任务
  • TaskAccessor.takenTask
    申领一个任务
  • TaskAccessor.releaseTask
    释放一个任务,任务状态转为created
  • TaskAccessor.hasTaskDealPermission
    判断用户是否有权限处理给定的任务
  • TaskAccessor.completeTask(java.lang.Long, java.lang.String, User, java.lang.String)
    完成一个任务,内部再次run
  • TaskAccessor.assignTaskWithResult
    当前所有人将任务转给指定用户
  • TaskAccessor.queryTasksByUser
    业务方可以使用该接口,获取审批人的任务列表,支持单人单任务,多人单任务
  • TaskAccessor.queryTasks
    查询任务
  • TaskAccessor.queryTaskByBizId
    查询任务
  • TaskAccessor.update(java.lang.Long, java.lang.String, java.lang.String)
    更新处理结果和意见
  • TaskAccessor.update(java.lang.Long, java.lang.Object)
    按taskId,全量覆盖bizInfo

建表DDL

模板表

…

流程表

…

节点表

…

活动表

…

任务表

…

参与者表

…

基于数据库的分布式quartz所需表

这里的QRTZ_为表前缀,可以改成业务方统一的前缀,比如像xxxx_bulbasaur_p一样的xxxx_FIRED_TRIGGERS。 在scheduleModule中配置,如果不指定,默认为QRTZ_

…

备注:

在xml中,可以通过表达式循环执行一个节点

xml

    
        

    
    
        
        
    
转义字符 字符
< 大于号
& & 和
' ‘ 单引号
" " 双引号

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

Java

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言