didi / turbo Goto Github PK
View Code? Open in Web Editor NEWTurbo is a light-weight flow engine framework, support BPMN2.0. 一款轻量级流程引擎服务框架,可作为底层服务支持各类流程设计、低代码设计、工作流、服务编排等场景
License: Apache License 2.0
Turbo is a light-weight flow engine framework, support BPMN2.0. 一款轻量级流程引擎服务框架,可作为底层服务支持各类流程设计、低代码设计、工作流、服务编排等场景
License: Apache License 2.0
冒昧的问一下:咱这个后面还维护不?有新功能计划么?
希望能支撑以下能力。作为流程引擎底层之外的,业务扩展包。
1、审批人驳回时能选择驳回到指定环节(activity/node),
场景:具体业务会驳回到对应环节,后面还会出报表统计岗位差错率
2、定义流程时可定义驳回不重走流程/重走流程
场景:一非常严格的场景会要求重走流程,一般不重走流程,毕竟不能麻烦领导审批2次。所以领导前是重走流程,领导后的不重走流程。驳回后再提交或审批会直接到领导这里来
3、审批人驳回时可选择驳回不重走流程/重走流程
场景:业务太灵活时再流程定义时指定的不准确,审批人自己去考虑,反正他的岗位职责就是审批这些因素
4、定义流程时可定义指定环节(activity/node)同一审批人自动审批
场景:领导可不虚幻审批两次。一般科室下面的人提交后第一个审批的就是科室经理,但是科室经理本身又是后面某个环节的负责人,那就会触发审批两次,因此第二次需要自动审批。
其他的什么发送模版消息,限定环节(activity/node)的审批人来源之类的简单的好实现,上面那种涉及流程驱动的不熟悉turbo不好整。
看介绍是可以回滚至开始节点和上一节点。支持回滚至中间的其他节点吗?
CallActivityDemoRunner 类的返回判断应该是 assert commitTaskResult.getErrCode() == ErrorEnum.SUCCESS.getErrNo()
看了下有subprocess的对象,但是没有相关的实现方案和单测,请问有子流程的实现方案吗
1.比如主键id,流程模型id建议修改。主键id应该可以支持配置,我看你的框架用的mybatis-plus 是支持配置的。对于生成id的字段,不要在框架源码里面写死。如何传入。
2.支持jdk17 与springboot 升级3
当想业务上想要使用分布式ID,Turbo不能自定义ID的生成
我看整体架构依赖数据库,有点担心性能是否能应对高并发?我理解应该设计为分层架构,分不同模块,按需引入。底层的执行引擎不依赖数据库,上层的应用层按需引入状态模块。
我看了下表数据之间的关联关系,设计了自增主键,但是在实际数据中好像并没有用到,也没有进行表之间的关联,而是用了一个uuid进行表数据之间的关联,这样做的话,后续我做多表join查询的时候会有性能问题吧?
群二维码再更新一个吧,过期了
Springboot框架虽然现在在市面上占有率比较高,但是也有些其他框架也像使用turbo引擎,期望作者能出一个不依赖任何框架的中间件吧
用了一下午, 没怎么用明白 😭
您好,支持部署bpmn格式的流程文件,是不
当想用其他脚本处理时(如Ruby等),不能扩展
能不能增加bpmn的xml形式支持?同时代码多加点注释
确实轻量,精简,没有想明白如何支持会签,或签这种功能
目前看都是又外部触发流程流转,请问是否支持用户任务自动执行业务逻辑,然后流转到下一节点
我们的数据库是postgres,不知道官方有没有计划支持postgres
有在线体验版吗
有配套的在线流程设计器吗
还是说 基于标准的 bpmn 格式
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make private static java.lang.invoke.MethodHandles$Lookup jdk.proxy2.$Proxy118.proxyClassLookup(java.lang.invoke.MethodHandles$Lookup) throws java.lang.IllegalAccessException accessible: module jdk.proxy2 does not "opens jdk.proxy2" to unnamed module @1afd44cb
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na]
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:200) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:130) ~[na:na]
at org.codehaus.groovy.reflection.CachedClass$3$1.run(CachedClass.java:86) ~[groovy-all-2.3.7.jar:2.3.7]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:81) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:250) ~[groovy-all-2.3.7.jar:2.3.7]
at groovy.lang.MetaClassImpl.populateMethods(MetaClassImpl.java:361) ~[groovy-all-2.3.7.jar:2.3.7]
at groovy.lang.MetaClassImpl.fillMethodIndex(MetaClassImpl.java:340) ~[groovy-all-2.3.7.jar:2.3.7]
at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3225) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:210) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:241) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:251) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:259) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:855) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:122) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:163) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.control.customizers.ASTTransformationCustomizer.findASTTranformationClass(ASTTransformationCustomizer.groovy:202) ~[groovy-all-2.3.7.jar:2.3.7]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:148) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:99) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.control.customizers.ASTTransformationCustomizer.findPhase(ASTTransformationCustomizer.groovy:224) ~[groovy-all-2.3.7.jar:2.3.7]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:148) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:99) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.control.customizers.ASTTransformationCustomizer.(ASTTransformationCustomizer.groovy:178) ~[groovy-all-2.3.7.jar:2.3.7]
at org.codehaus.groovy.control.customizers.ASTTransformationCustomizer.(ASTTransformationCustomizer.groovy:186) ~[groovy-all-2.3.7.jar:2.3.7]
at groovy.text.markup.MarkupTemplateEngine.(MarkupTemplateEngine.java:84) ~[groovy-all-2.3.7.jar:2.3.7]
at org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer.createTemplateEngine(GroovyMarkupConfigurer.java:160) ~[spring-webmvc-5.3.23.jar:5.3.23]
at org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer.afterPropertiesSet(GroovyMarkupConfigurer.java:153) ~[spring-webmvc-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.23.jar:5.3.23]
... 16 common frames omitted
看了流程执行逻辑里,不管是getUniqueNextNode方法还是calculateNextNode方法,都是需要明确走到下一个确定的节点,那如何扩展并行网关
看了源代码,发现getExecuteExecutor方法返回值是单个的,不符合并行网关的需求。是否有考虑到这个场景或者提供个解决思路?
看了turbo的设计,很赞!但有个疑惑,turbo注重在流程的定义和执行,但是看了源代码,貌似框架本身也没有提供用于流程节点去绑定业务处理逻辑的扩展点?那如果这种没有可以统一的入口定义了,后续拖拉拽来编排业务逻辑,如何实现标准化的管理呢?l可能的话,能否公布下turbo后续要支持的特性和预期时间呢?
缺少parent_flow_instance_id 字段
新建流程后, 默认flow_model
为NULL
, 导致前端解析错误, 无法显示界面.
近期我浏览了许多工作流框架,发现Trubo因其轻量级特性、最小依赖以及能够直接嵌入运行而给我留下了深刻的印象,这让它能够非常好地与LogicFlow配合使用。然而,遗憾的是,它目前不支持JDK 17,这对我当前的设置是一个明显的限制。
请问在不久的将来有没有可能使Trubo兼容JDK 17?或者是否有其他方法或思路,我可以在本地拉取代码后进行适配?期待您的回复,谢谢!
流程初始化、流程提交过程多个方法有用到BeanUtils.copyProperties(),比如 FlowInstancePO 属性拷贝至 InstanceDataPO过程中,FlowInstancePO中主键 ID可能在 InstanceDataPO实体表中已存在,直接拷贝后再调用 InstanceDataPO 的insert方法会报主键重复错误
TypeError: Cannot read properties of undefined (reading 'configure')
at D:\ideaworkspace\turbo-client\node_modules\vite\dist\node\chunks\dep-971d9e33.js:51435:18
at Array.forEach ()
at proxyMiddleware (D:\ideaworkspace\turbo-client\node_modules\vite\dist\node\chunks\dep-971d9e33.js:51423:26)
at createServer (D:\ideaworkspace\turbo-client\node_modules\vite\dist\node\chunks\dep-971d9e33.js:56584:25)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async CAC. (D:\ideaworkspace\turbo-client\node_modules\vite\dist\node\cli.js:688:24)
感谢开源,代码逻辑非常清晰,让我这个不写 java 的人也能完整的看完整个逻辑。但是不太清楚怎么和具体的业务关联起来。
比如下面这个点我非常疑惑:
流程直到用户节点挂起或者结束节点完成
就会停下,如果说 审批人请求 commitTask
之后,后面要经过很长的节点才会到达下一个挂起的节点,那这个审批人岂不是要一直等?
有计划支持springboot3吗?
有待办相关的API吗
你好,能做个整合好logicflow画流程图的demo么,方便扩展和使用
当前v1.1.0版本存在问题,直接从**仓库拉取的engine包无法直接使用
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.