百度
360搜索
搜狗搜索

flowable工作流,flowable6.7.2id没有前缀详细介绍

本文目录一览: flowable工作流分支汇聚

????flowable 常用的有三种网关:并行网关,排他网关,包容网关

????并行网关:所有网关后的活动都会同时启动,即使有条件也会忽略条件,汇聚时,所有完成的线路在此等候。直到所有的线路都执行完成,才继续向下执行

????排他网关:按照输出流的顺序计算 ,第一个满足条件的活动会启动,其他的直接忽略,如果所有的条件都不满足,引擎会抛出异常。只有一个分支

????包容网关:判断每一个条件,符合条件的活动启动,不符合不会启动。汇聚时,等待所有启动的线路全部完成,才会继续下一个节点

????注:此处的启动,是指活动产生相应的活动实例

????所有的分支活动都会启动,汇聚节点会启动多次。

? ??

例1:

不存在网关时,启动流程同时开启,A,B两个活动。 A提交产生C, B提交也会产生C。 同时会存在两个C ,提交一个C的时候,流程不会结束,另外一个C还可以继续提交,第二个C提交后,流程结束。

例:2:

流程同时产生A,B 两个活动,A提交了到达网关,等待B提交。B提交了才会到达C

总结:使用网关按照网关的规定执行,不使用网关,之前启动,即使同一个节点可能启动多次。

工作流引擎flowable基于springboot下,命令模式实现源码分析

在init()方法里,有一大堆的初始化。有个方法initCommandExecutors();

方法initCommandExecutors里的内容如下

方法initCommandInterceptors里的getDefaultCommandInterceptors内容

创建了各种拦截器,也就是当执行某个命令时,会执行这些拦截器。(包括了日志、事务等拦截器)
例如当执行taskService.complete完成任务时,会被事务拦截器拦截,启动事务等其它功能,如果需要我们也可以自定义拦截器

方法initCommandExecutor里的内容如下

把各个拦截器命令串联起来

centos7使用flowable工作流显示字体乱码问题

在centos7使用fontconfig安装字体库

安装成功后,打开/usr/share目录可以查看到两个文件目录

添加中文字体在/usr/share/fonts目录下创建目录chinese
在windows上查找要使用的中文字体,打开C:\windows\fonts目录
将需要的字体传到/usr/share/fonts/chinese目录下
目录进行授权

使用ttmkfdir来搜索目录中所有字体信息

执行命令

修改字体配置文件

:wq保存退出
刷新内存中的字体缓存

可以通fc-list查看字体列表

flowable任务办理不同意

一、根据flowable这类国外的开源工作流,它的任务办理方式为两种:
1.任务需要签收才办理,即有一个接收任务的过程:任务创建后,流程进入一个等待的状态
2.任务不需要签收,就可以直接办理

flowable多实例会签如何在java中控制结束

要在Java中控制多实例会签任务的结束,可以使用以下方法:1、定义多实例会签任务:在BPMN流程定义文件中定义多实例会签任务。您可以使用Flowable提供的多实例会签任务元素(例如userTask)以及相关的属性(例如multiInstanceLoopCharacteristics)来定义多实例会签任务的行为。2、设置循环集合:在多实例会签任务的multiInstanceLoopCharacteristics属性中,设置一个循环集合。这个集合可以是一个列表或表达式,用于确定多个参与者的数量。3、控制子实例完成:在Java代码中,在每个子实例(即参与者)完成任务后,需要通过Flowable的API来标记该子实例的完成状态。您可以使用taskService.complete(taskId)来完成子实例的任务。4、监控多实例会签:可以使用Flowable提供的监控机制,例如查询正在运行的实例数量、已完成的实例数量等来监控多实例会签任务的进度。5、判断结束条件:使用Flowable提供的API,例如历史数据查询(HistoryService)来查询已完成的子实例数量,并与预定的参与者数量进行比较。如果已完成的子实例数量达到预期数量,那么可以根据业务逻辑继续流程的执行。Flowable是一个开源的轻量级工作流与业务流程管理引擎,它是基于Java语言的,符合BPMN2.0规范。Flowable提供了一套强大的API和工具,用于建模、执行和管理各种复杂的工作流和业务流程。

flowable 6.5.0在linux环境实例化异常问题

1、oracle数据库当flowable用户存在工作流相关表的时候,ftest用户初始化失败(自动建表失败)。2、删除flowable用户,ftest初始化成功。3、再次新建flowable用户,使用flowable用户连接,初始化失败。同时发现,yml文件中,存在flowable。database,schema属性,(解释为:In,some,situations,you,want,to,set,the,schema,to,use,for,table,checks,/,generation,if,the,database,metadata,doesn't,return,that,correctly。)。将其设置为flowable后,启动时抛出异常(SQLFeatureNotSupportedException),异常抛出点为setSchema。查看Druid源码,当调用setSchema会无条件抛出异常。4、因此可以确定的是,目前遇到的工作流无法初始化,是因为同一个原因引起:数据库中,存在其他已经初始化过的用户/域。

flowable变量获取失败

flowable变量获取失败?
你好!建议devops自动化项目中使用flowable(类似于activiti的流程引擎)来进行自动化流程编排,需要将每个步骤执行的结果使用流程变量来保存,由于数据类型未知,采用fastjson来保存对象变量,使用flowable的api进行变量存储
flowable变量获取失败?
你好!建议devops自动化项目中使用flowable(类似于activiti的流程引擎)来进行自动化流程编排,需要将每个步骤执行的结果使用流程变量来保存,由于数据类型未知,采用fastjson来保存对象变量,使用flowable的api进行变量存储
spring boot
flowable中反序列化流程变量失败Couldn‘t deserialize object in variable ‘xxxx‘
forgetmetoo
原创
关注
0点赞·1400人阅读
flowable中反序列化流程变量失败Couldn't deserialize object in variable 'xxxx'
devops自动化项目中使用flowable(类似于activiti的流程引擎)来进行自动化流程编排,需要将每个步骤执行的结果使用流程变量来保存,由于数据类型未知,采用fastjson来保存对象变量,使用flowable的api进行变量存储:
Map

rootNodeMap = new HashMap<>();

String responseNode = "response";

String requestNode = "request";

// 省略resultMap处理

// 省略resultMap处理

rootNodeMap.put(responseNode, resultMap);

rootNodeMap.put(requestNode, requestMap);

runtimeService.setVariable(processInstanceId, "rootNode", rootNodeMap);

登录后复制

由于流程变量中包含有对象嵌套数组的情况,在使用fastjson的JSONObject保存了主节点以后,在后续使用rootNode变量时,会出现反序列化失败的情况。具体错误堆栈如下:

org.flowable.common.engine.api.FlowableException: Couldn't deserialize object in variable 'rootNode'

at org.flowable.variable.service.impl.types.SerializableType.deserialize(SerializableType.java:117)

at org.flowable.variable.service.impl.types.SerializableType.getValue(SerializableType.java:65)

at org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntityImpl.getValue(VariableInstanceEntityImpl.java:132)

at org.flowable.variable.service.impl.persistence.entity.VariableScopeImpl.getVariable(VariableScopeImpl.java:271)

at org.flowable.variable.service.impl.persistence.entity.VariableScopeImpl.getVariable(VariableScopeImpl.java:250)

at org.flowable.common.engine.impl.el.VariableContainerELResolver.getValue(VariableContainerELResolver.java:39)

at org.flowable.engine.impl.el.ProcessVariableScopeELResolver.getValue(ProcessVariableScopeELResolver.java:57)

at org.flowable.common.engine.impl.javax.el.CompositeELResolver.getValue(CompositeELResolver.java:234)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstIdentifier.eval(AstIdentifier.java:95)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstProperty.eval(AstProperty.java:68)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstProperty.eval(AstProperty.java:68)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstBinary$SimpleOperator.eval(AstBinary.java:31)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstBinary.eval(AstBinary.java:112)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstEval.eval(AstEval.java:53)

at org.flowable.common.engine.impl.de.odysseus.el.tree.impl.ast.AstNode.getValue(AstNode.java:31)

at org.flowable.common.engine.impl.de.odysseus.el.TreeValueExpression.getValue(TreeValueExpression.java:122)

at org.flowable.engine.impl.delegate.invocation.ExpressionGetInvocation.invoke(ExpressionGetInvocation.java:34)

at org.flowable.engine.impl.delegate.invocation.DelegateInvocation.proceed(DelegateInvocation.java:35)

at org.flowable.engine.impl.delegate.invocation.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:26)

at org.flowable.engine.impl.el.JuelExpression.resolveGetValueExpression(JuelExpression.java:44)

at org.flowable.common.engine.impl.el.JuelExpression.getValue(JuelExpression.java:48)

at org.flowable.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:37)

at org.flowable.engine.impl.util.condition.ConditionUtil.hasTrueCondition(ConditionUtil.java:47)

at org.flowable.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:84)

at org.flowable.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:39)

at org.flowable.engine.impl.agenda.ContinueProcessOperation.executeActivityBehavior(ContinueProcessOperation.java:275)

at org.flowable.engine.impl.agenda.ContinueProcessOperation.executeSynchronous(ContinueProcessOperation.java:159)

at org.flowable.engine.impl.agenda.ContinueProcessOperation.continueThroughFlowNode(ContinueProcessOperation.java:114)

at org.flowable.engine.impl.agenda.ContinueProcessOperation.continueThroughSequenceFlow(ContinueProcessOperation.java:327)

at org.flowable.engine.impl.agenda.ContinueProcessOperation.run(ContinueProcessOperation.java:80)

at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:88)

at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:72)

at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:56)

at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:25)

at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53)

at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:72)

at org.flowable.common.spring.SpringTransactionInterceptor.lambda$execute$0(SpringTransactionInterceptor.java:56)

at org.flowable.common.spring.SpringTransactionInterceptor$$Lambda$532/1508152985.doInTransaction(Unknown Source)

at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)

at org.flowable.common.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:56)

at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)

at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56)

at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:51)

at org.flowable.engine.impl.TaskServiceImpl.complete(TaskServiceImpl.java:208)

at com.dashuf.srgp.workflow.devops.DevopsTaskAutoCompletedHandler.autoComplete(DevopsTaskAutoCompletedHandler.java:41)

at com.dashuf.srgp.workflow.devops.DevopsTaskAutoCompletedHandler$$FastClassBySpringCGLIB$$f48068ba.invoke(

)

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)

at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)

at org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$663/1969812924.call(Unknown Source)

at com.dashuf.srgp.config.CustomThreadPoolTaskExecutor.lambda$submit$8(CustomThreadPoolTaskExecutor.java:46)

at com.dashuf.srgp.config.CustomThreadPoolTaskExecutor$$Lambda$664/488650178.call(Unknown Source)

at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)

at java.util.concurrent.FutureTask.run(FutureTask.java)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

Caused by: com.alibaba.fastjson.JSONException: autoType is not support. [B

at com.alibaba.fastjson.parser.ParserConfig.checkAutoType(ParserConfig.java:920)

at com.alibaba.fastjson.parser.ParserConfig.checkAutoType(ParserConfig.java:911)

at com.alibaba.fastjson.JSONObject$SecureObjectInputStream.resolveClass(JSONObject.java:548)

at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)

at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)

at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345)

at java.io.ObjectInputStream.access$300(ObjectInputStream.java:206)

at java.io.ObjectInputStream$GetFieldImpl.readFields(ObjectInputStream.java:2157)

at java.io.ObjectInputStream.readFields(ObjectInputStream.java:541)

at java.math.BigInteger.readObject(BigInteger.java:4258)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)

at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:501)

at java.math.BigDecimal.readObject(BigDecimal.java:3748)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at java.util.HashMap.readObject(HashMap.java:1396)

at sun.reflect.GeneratedMethodAccessor1139.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)

at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:501)

at com.alibaba.fastjson.JSONObject.readObject(JSONObject.java:488)

at sun.reflect.GeneratedMethodAccessor1138.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at java.util.HashMap.readObject(HashMap.java:1396)

at sun.reflect.GeneratedMethodAccessor1139.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at java.util.HashMap.readObject(HashMap.java:1396)

at sun.reflect.GeneratedMethodAccessor1139.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at org.flowable.variable.service.impl.types.SerializableType.deserialize(SerializableType.java:113)

... 57 common frames omitted

登录后复制

看字面意思理解,应该是无法识别关键字[B,猜测应该是fastjson在序列化的时候写入class的数据类型,看起来像是Byte数组之类,目前使用的fastjson版本是1.2.49版本,在github搜索了一下,目前最新版本已经到1.2.76,并且中间有一些issue提到Array、Map等,和我的应用场景比较相似,这些issue已经进行了升级解决。

于是尝试着将fastjson版本升级到1.2.76,再次执行,成功通过,问题解决。

这个问题排查定位从上周五的晚上一直到本周一的早上,持续时间很长,但是修改方式却非常简单,只是升级了fastjson的版本而已,之前一直没有怀疑是fastjson的问题,而是将重点放在自己的中间数据处理上面。所以后续遇到类似问题,可以先尝试这种快捷的方案,节约时间。

devops

activiti

java

spring boot

个人写真照片

精选推荐

广告

Couldn't deserialize object in variable 'user1' 反序列化失败

4620阅读·0评论·0点赞

2017年2月17日

org.activiti.engine.ActivitiException: coudn‘t deserialize object in variable ‘a‘.获取流程变量无法反序列化问题。

1025阅读·0评论·2点赞

2019年10月20日

解决:Caused by: org.flowable.common.engine.api.FlowableWrongDbException: version,问题

5893阅读·0评论·1点赞

2021年5月21日

org.activiti.engine.ActivitiException: Couldn't deserialize object in variable 'application'

619阅读·0评论·0点赞

2016年12月23日

Cannot construct instance of `com.*` (although at least one Creator exists): cannot deserializ

3.0W阅读·7评论·6点赞

2020年3月3日

个人委托律师授权委托书,专业经验丰富

精选推荐

广告

[Flowable6.4.1]DMN报错Error parsing '#{input1 == >19 }': syntax error at position 13, encountered '>'...

2336阅读·0评论·0点赞

2019年4月15日

Flowable 一些异常报错、注意事项(4)

1532阅读·0评论·1点赞

2022年4月21日

Flowable实战(一)启动第一个完整流程

2661阅读·5评论·13点赞

2022年1月7日

Activity FlowableException: Couldn't serialize value

874阅读·0评论·0点赞

2019年12月29日

Flowable工作流兼容达梦数据库

1332阅读·0评论·0点赞

2021年10月8日

使用Mycat时,activiti出现异常 Couldn‘t deserialize object in variable ‘assignee‘

610阅读·0评论·0点赞

2020年9月23日

使用Mycat时,activiti出现异常 Couldn't deserialize object in variable 'assignee'

4448阅读·2评论·0点赞

2018年8月17日

flowable 流程表单_Flowable 实现【选择下一步流程审核人】

1258阅读·0评论·0点赞

2020年12月19日

java 类不能序列化_Java : 实体类不能序列化异常

363阅读·0评论·0点赞

2021年2月13日

activiti在运行时报错:couldn‘t find a variable type that is able to serialize XXX

1224阅读·0评论·0点赞

2021年3月30日

Flowable FlowableException:flowable-exclusive-gateway-condition-not-allowed-on-single-seq-flow

570阅读·1评论·1点赞

2022年3月21日

Activiti基础 condition expression returns non-Boolean 解决方案

1.3W阅读·7评论·5点赞

2018年8月19日

nested exception is org.flowable.common.engine.api.FlowableException: Error initialising dmn data mo

阅读更多 >>>  springboot如何启动,springboot启动5个步骤

java工作流引擎中,哪个在市面上用得最多?

1、如果你IT公司想要把这个工作流引擎加到你公司已有开发工具开发框架中,或者你是个人爱好,那花点时间去研究下jbpm、activity都是可以的,两者用的人都蛮多,历史也蛮久,很难说哪个好哪个不好;
2、如果是想要商用或者想要快速使用,比如两三个月就能让企业用起来并且发挥很大的作用,那建议找专业的BPM厂商,比如广州天翎、北京炎黄、蓝凌泛微也行,他们大多发展10年+了,产品已经很成熟,也已经有诸多用户实际用过,这样免去了你去当小白鼠的成本和风险;
3、好的产品不仅要现在好,还要从长远考虑将来也好,所以结合我们公司选型工作流厂商的经验建议如下:(1)要微服务架构,现在企业的信息化系统太多了,这个工作流要能够平台化使用也要能够单独调用和第三方系统整合;(2),现在国家经济下行,企业发展压力和风险大,之前的信息化建设大多五花八门重复浪费,现在强调一体化管理,所以要能够支持pass服务,打造成集团统一流程云平台,用多租户模式服务下属子公司;(3)国外流程讲求体系化规范化,但到了中国,中国的领导是很难伺候的,有各种癖好和习惯,所以这个工作流要支持中国式管理实际业务,比如加签、比如自由流转、比如父子流程嵌套、比如自动节点、。。。我就不一一举例了,所以要有政府和集团型的实际案例。
SDP开发平台有相应的工作流引擎!
国外针对两者的一个调查,仅供参考!
总之,很难说谁领先多少,仁者见仁智者见智吧。
jbpm较早(2004左右推出),而activiti晚一些(2010左右推出),但是后者有奋起直追的趋势!
主要用JBPM和OSWorkFlow 。
JBPM主要是JPDL语言的学习,主要是用来编写流程文件;理解3个接口:动作处理接口(提供影响流程执行的方法,在event和action元素中被回调),判定处理接口(用在decision判定节点中,提供方法来判定节点的转向),委派处理接口(用在task的委派子元素assignment中,用来指定将任务分配给指定的人员或角色)。
OSWorkFlow 主要是工作流文件定义的元素,主要用来编写工作流;OSWorkFlow.xml及propertySet.xml文件的配置;InputMap接口、Workflow 接口及WorkflowDescriptor接口。
jbpm是业界当前用得最多的工作流引擎,应该算是比较好的,但是相对于国内的工作流模式还是要完善不少的内容。
这个链接可以帮你了解更多http://blog.csdn.net/victor16345/article/details/5614676
一起来看看java快速开发框架工作流引擎快速开发平台。 希望您能从中找到适合您自己的流程引擎。
Activiti是由jBPM 的创建Tom Baeyen离JBoss之后建立的项目,构建在开发 jBPM 版本1到4时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。文档丰富,csdn有相应专栏,并且国人贡献了一本《activiti实战》详细地讲解了基于activiti的开发内容,网上教程资源丰富。Activiti上手比较快,界面也比较简洁、直观,学习周期相对较短。
官方提供webapp war包,部署在Tomcat下可快速操作和了解activiti,esclipse提供支持activiti项目的ide插件,总的来说环境支持良好。
代码量大,核心代码改动难度较大,但提供了完整的技术文档,架构良好,网上开发文档较多,一定上降低了二次开发的难度。
支持,用户体验好,但是流程设计器是英文版,还需要汉化。
支持多种表单:动态表单,外置表单,普通表单,但表单设计未集成,需要自己集成表单设计。
支持绝大部分工作流功能,符合中国国情的审批流程需要在此基础上进行开发。
JBPM(Java Business Process Management):JAVA业务流程管理,是一个可扩展、灵活、开源的流程引擎, 它可以运行在独立的服务器上或者嵌入任何Java应用中。
1、jBPM3是一个完整的工作流系统实现,面向开发人员,目的在于简化对组织核心流程进行支撑的软件创建,不支持标准。
2、jBPM4引入PVM,使其拥有更强大的扩展性,同时增加BPMS特性,这些特性包括了对BPMN的支持、面向业务人员的Web建模器和简单统计分析功能的加入。
3、jBPM5基于原先的Drools Flow,支持BPMN,通过与Drools的合并支持BAM,通过内容仓库增加对流程可视化的支持。由于放弃了jBPM4的PVM,引擎的可扩展性受到损害,并且不再支持jPDL。
JBoss Seam,算得上是Java开源框架里面最优秀的快速开发框架之一。
Seam是一个很棒的选择,作为程序员来说,要比用 Spring/Hibernate/Struts省心的多,更能够把精力放在业务逻辑的编写上面,开发效率也很不错,可能是Java开源框架里面最优秀的快速开发框架之一了。
Activti的学习价值比较高,是工作流入门的好教材,可以学习里面好的代码风格和思路。Activiti最大的优点就是免费开源,小项目中应用简单的串行并行流转基本能满足需求。现在很多开发人员会选择它。但是要拿Activiti做到中国式的企业级应用门槛和难度很高。想用Activiti来做符合中国国情的审批流程,其实还需要做大量的开发封装。接下来介绍一款基于Activiti扩展的工作流引擎。
XJR java快速开发框架工作流程引擎:采用主流的Activiti工作流引擎,遵循bpmn规范,可实现XML、Json一键导入导出,以及添加了人员动态选择、便捷式会签设置、便捷式任务委托设置、添加自定义表单、自定义节点按钮、动态变量选择(包括会签变量、按钮变量、表单变量)以及各节点属性优化,遵循以客户为中心的优化原则,将整个流程的操作变得简单、快捷,实现0基础客户短时间可自由编辑流程模板。
XJR快速开发平台可视化开发,高效快速,开发成本低。兼容强,支持多种数据库,基于B/S架构,纯浏览器应用,只需要拖拽组件,拼接流程,就能实现各层的审批。面向服务接口设计,容易整合企业现有的资源。前后端分离设计,采用shiro权限验证,通过简单配置就可以实现功能权限和数据权限。开源级代码,二次扩展强。
XJR快速开发平台技术选型
使用目前流行的多种web技术,包括springboot, JPA,Druid, Activiti,Lombok,swagger,poi,WebSocket,Jquery,BootStrap, maven,Jenkins 等等,支持多种数据库MySQL, Oracle, sqlserver等。 分层设计:使用分层设计,分为dao,service,Controller,view层,层次清楚,低耦合,高内聚。 安全考虑:严格遵循了web安全的规范,前后台双重验证,参数编码传输,密码md5加密存储,shiro权限验证,从根本上避免了SQL注入,XSS攻击,CSRF攻击等常见的web攻击手段。
模块功能
功能模块:开发向导、代码 生成器,商业智能、工作流、报表管理、移动端开发、作业计划、多语言、数据源管理、企业微信、钉钉、消息管理,菜单 管理,用户管理,机构管理,角色管理,区域管理,字典管理,日志查询等基础模块。

工作流引擎哪家好?

工作流是一个固定好的框架,大家就按照这个框架来执行流程就行了,比如:在任何一家公司中,想要请假的员工基本上都有请假流程,或口头的传达或填写在纸张上,流程止步于上一级。在信息化工作流场景中,流程的发起者所提交的信息会直接提交给负责人审核,审核通过后再层层报备,在权限部门中都有申请记录,或财务、或人事、或考核,使企业的管理更加透明。
在软件开发过程中,如果从零开发工作流,那开发成本非常高,可以考虑一下JNPF,JNPF工作流引擎是实现工作流的系统化工具,是一套完整的解决方案。
JNPF开发平台仅需3个步骤即可构建个性化的工作流程,JNPF.WF工作流只需要一台电脑或一个手机,随时随地查看和审批进度,这样哪怕您有多个公司只需要一套工作流系统都可以监管所有公司的业务流向、日程开销、财务收入、工作内容等等一系列的工作,只有想不到的没有做不到的。
分享一下JNPF快速开发平台
JNPF通过在线开发、流程引擎、代码生成等核心功能快速构建相关业务系统,可以帮助开发者实现5分钟配置一张业务表单、5小时搭建一个专属应用、5天落地一个管理方案,并且易于维护、易于扩展、安全稳定,助力企业打通数字化的“最后一公里”。
有着强大的工作流引擎,实现界面化流程的建模,使得流程设计变得简单和可操作,用户通过拖、拉、点、拽即可快速实现流程设计,快速降低业务逻辑、业务流程梳理的再造成本。
体验地址:http://www.jnpfsoft.com/?from=bdzd1
分享一款JVS开源框架系列-流程引擎「含开源地址」
一、项目简介 JVS是面向软件开发团队可以快速实现应用的基础开发框架,采用微服务分布式框架,提供丰富的基础功能,集成众多业务引擎,它灵活性强,界面化配置对开发者友好,底层容器化构建,集合持续化构建。
项目仓库: https://gitee.com/software-minister/jvs
社区版已开源,在授权情况下支持100%源码同步,支持商用。
二、流程引擎介绍 流程引擎本质是解决业务流转过程中,带来的大量的重复的业务逻辑的,通过流程引擎可以缩减大量的业务开发成本,并提供一系列机制确保我们的业务的流畅度与准确性。

目前市面上流程引擎有比较多种:Osworkflow、JBPM、activiti、flowable、Camunda等这几种主流的方案,目前我采用的是可视化交互性更好的流程引擎,下面给大家简单介绍下:
1、新建了流程,设置好相关条件,点击设计流程
2、流程设计界面
3、流程设置
4、完成发布的流程可以直接在流程申请入口自动生成
5、配置任务节点与条件
6、支持配在线表单
7、跳转表单配置(单独详细介绍表单的配置)
三、 亮点与差异 相对业内其他方案,我们的表单引擎具备以下亮点:

青谷工作流系统是一套提供给集成商、软件开发商和最终客户的基础平台软件,它以流程管理和流程应用为核心,通过配置及二次开发,实现流程的自动化处理,系统由流程引擎、设计工具、管理工具和应用工具4 部分组成。流程引擎作为青谷工作流产品的核心组件,具备高内聚、松耦合等特性,并且内置大量接口,方便集成第三方系统。针对国内用户特点,青谷工作流引擎在业内率先提供多角度指定流程办理人、流程流向、办理方式、表单属性自动调整、多路并发、异步流转等多种流程操作手段等功能,充分满足用户实际业务需求。更多功能等您来发现!

雀书的工作流引擎很不错。可以自定义表单,有关联表;可视化流程图编辑器;节点权限控制;规则引擎;自动化引擎;

天翎的工作流引擎就很棒啊!!
从审批路径控制-审批人员控制-批对象权限控制-审批时限控制-批动作控制-审批网关控制-审批通知控制
无死角工作流
来,
看看下面简单的介绍:

审批路径控制
图形化箭头指向,真实模拟流程流转路径;指哪打哪,无论前进还是回退,进入送出均可 条件校验。
审批人员控制
可从组织机构、角色库、页面数据、流程变量和规则脚本等获取审批人;可通过维度内外部多因素单独或联动关系筛选审批人。
批对象权限控制
可对表单字段及操作按钮权限进行详实控制;可按业务规则提供只读、隐藏和修改等权限 设置。
审批时限控制
严格控制审批时限,超时可自动提交或触发指定动作;提供设计模式和脚本模式双重控制机制。
批动作控制
支持单人办理、多人顺序、多人并行、抢占式办理、内部循环、人工合并等处理场景;
除常规操作,主办加签、会办加签、补签意 见、异步提交、指定回退、自由指派、节点 排序、节点互斥、子流程单实例等中式流程操作应有尽有。
审批网关控制
不管是常规流程还是流程嵌套,不管是往前流转还是往后回退都详实控制;到达(聚合、非聚合)、通过(或、且、非)和送出(并行、串行)各个节点严格把关。
审批通知控制
提供待办、已办、抄送等通知窗口,轻松获取发起人、业务名称和关键字段等流程摘要;通知方式灵活多样,包括站内消息中心、邮 件、短信、微信、APP等。

你可以看看这个IBM Business Automation Workflow,下面的文档你可以深入了解一下。
没遇到好用的,看基于什么业务场景

flowable6.7.2id没有前缀

flowable672id没有前缀?
答案如下:是因为省略了前缀了。首先第一步先点击打开设置按钮,然后帐户管理在页面点击账号安全中心进入即可完成!
一 表结构
前面一章的关于spring的demo,我们配置好数据库,第一次会自动为我们给的数据库生成对应的表,但是表实在是太多,网上一些资料比较过时,举个例子有的材料列举了二十几个,但实际上我这个版本不止,我随便数了一下都七十几个了。
还有就是Flowable的表很多创建的名字也是为了能“见词知意”,会有前缀或者类似“词根”之类的来拼接。同样很多人的资料博客关于这些,好像抄的是同一份一样。都是常见的几个,你想DMN这些都没人提及。
这里以我现在的flow able表结构做一个大概的总结介绍:
首先上个图
在这里插入图片描述
在这里插入图片描述
大概表名分三段
XXX_XXX_XXXX
第一段
第一段以ACT_APP_APPDEF 和 FLW_CHANNEL_DEFINITION为例子
ACT代表的Activiti 毕竟是同一批人另起的炉灶,另一方面遵循的都是BPMN还要考虑到兼容人家,方便客户转移过来。
ACT_APP_APPDEF看字面意思是应用定义表。
FLW估计就是Flowable的自己的时缩写。
FLW_CHANNEL_DEFINITION这个的意思是,Flowable支持JMS、Kafka和RabbitMQ源和目标,但也可以使用其他适配器类型进行扩展。部署通道定义时,新定义将插入到FLW_CHANNEL_DEFINITION表中,表明翻译过来Flowable的渠道定义。
第二段
APP指的是应用
CO 我认为是connection连接的意思,我看内容大部分跟连接数据库这些相关
act_cmmn_:CMMN流程引擎数据
act_dmn_ : DMN流程引擎
act_evt_log: 事件日志
act_fo_:表单引擎数据
act_ge_: 通用数据
act_hi_:表包含历史数据
act_id_:存储与用户身份相关数据
act_prodef_info:流程定义的信息
act_re_: 流程定义相关数据的存储库
act_ru__:流程实例运行时数据,流程结束删除数据
第三段
实际上这一段,如果不是太长,有的很多就是整个单词,DEF就是定义的意思,DECISION就是描述的意思,JOB就是任务等,总之就是相对第二段比较容易看出来,像DMN谁能一眼看出来到底是什么。
怎么说呢,太多了这些,基本是遇到问题看那个,记住几个常用的就可以了,不一定都能接触的到,同样也能想象出这个工作流设计要多复杂,我们自己的一些审批任务,基于人家的又是都觉得有点绕,何况人家提供的基础的服务支持设计的。
流程变量
流程实例执行时,要保存数据,这些都被称作变量variable,流程变量分两种:运行时变量,历史变量。
运行时变量
就是还在运行的流程实例的持有的变量,流程实例结束了,这个实例的变量也就在这个表的被剔除了,变成历史变量。
运行时变量,存的表是act_ru_variable
#定义时就设置了变量
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map

variables);

#或者运行中设置变量

void setVariable(String executionId, String variableName, Object value);

void setVariableLocal(String executionId, String variableName, Object value);

void setVariables(String executionId, Map

variables);

void setVariablesLocal(String executionId, Map

variables);

#都运行时变量,这个如果实例运行完了就查不到留在这个表

Map

getVariables(String executionId);

Map

getVariablesLocal(String executionId);

Map

getVariables(String executionId, Collection

variableNames);

Map

getVariablesLocal(String executionId, Collection

variableNames);

Object getVariable(String executionId, String variableName);

T getVariable(String executionId, String variableName, Class

variableClass);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

历史变量

历史变量其实算是比较多的,一般来说除非是运行时实例,自己这边出问题直接看问题看的是运行时的变量(其实这个也能在历史变量中看到)。如果是对已经审批完的流程有疑问基本看的都是历史变量。

历史变量,存的是act_hi_varinst表act_hi_varinst

实例创建,历史变量有对应的变量,实力结束依旧能找到,可以说时变量的“永久”。

historyService.createHistoricVariableInstanceQuery()

.processInstanceId("XXX")

.orderByVariableName.desc()

.list();

1

2

3

4

5

1

2

3

4

5

重要字段介绍

(1)processDefinitionId 流程定义Id

(2)processDefinitionKey 流程定义Key

(3)processDefinitionName 流程定义名称

(4)procInstId 流程实例Id

(5)taskId 任务Id

(6)executionId 执行Id

前三个都是流程定义的,就是说我们发起流程通过ID,key,name这些来发起流程。

你发起流程就会有一个实例,大概的例子就是Java的calss和对象一样,class定义了整体的结构和意义,但是真正用的还是被new出来并且赋值的一个个对象。流程就是class,你定义好了,去处理一个个具体的场景时,就是一个个具体的对象,也就是流程实例。

(4)(5)(6)其实是一级一级的关系,一个流程实例ID可以对应多个执行ID,一个执行对应多个task(这个我后面验证一下,暂时我这边也不太确定),反正大多数材料形容三个的关系是“面-》线-》点”。

表单

表单其实就是定义的部分,就是通过一种简单的方式去构造一个flowable流程引擎。

(看下面的官网最新的英文解释,更对味,可以参照后面某个版本的flowable的中文手册翻译)

The Flowable Form engine is structured in a very similar way to the Flowable process engine. As a result parts of the documentation have a resemblance with their process engine counterpart.

在这里插入图片描述

在这里插入图片描述

在实际业务中,流程伴随着各种各样的表单,Flowable引擎将表单数据统一作为流程变量存入变量表中。所以,对于Flowable引擎,可以完全独立于表单运行,因为可以用流程变量替代表单数据。

但一般的,我们需要结构化的数据,表单仍然是我们推荐的用法。

表单:内置表单,外部表单

内置表单

以请假为例,XML内容

阅读更多 >>>  用U盘启动你的电脑

<flowable:formproperty id="startDate" name="请假开始事件" type="date"
datePattern="dd-MMM-yyyy" required="true" readable="true" writeable="true"/>


<flowable:formproperty id="endDate" name="请假结束事件" type="date"
datePattern="dd-MMM-yyyy" required="true" readable="true" writeable="true"/>


<flowable:formproperty id="reason" name="请假原因" type="string"
required="true" readable="true" writeable="true"/>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

StartFormData FormService.getStartFormData(String processDefinitionId)

1

1



TaskFormData FormService.getTaskFormData(String taskId)

1

1

外部表单

根据表单文件自行渲染的任务表单,称为外部表单。

1

2

3

4

1

2

3

4

外部表单的定义

表单定义文件的后缀为.form。

表单的JSON定义以key、name和description开头。

表单引擎通过属性key来辨别表单在整个表单引擎中的唯一身份。对于来源相同的同一个表单定义的版本系统也是基于属性key运作的。

第二部分是一个数组类型fields,表单定义的字段在这里阐明。

第三部分是可选的,用来定义表单的结果outcomes。

xml文件例子

{

"key": "form1",

"name": "My first form",

"fields": [

{

"id": "input1",

"name": "Input1",

"type": "text",

"required": false,

"placeholder": "empty"

}

],

"outcomes": [

{

"id": "null",

"name": "Accept"

},

{

"id": "null",

"name": "Reject"

}

]

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

部署表单

在springboot环境下,resources/forms目录下任何.form后缀的表单定义文件都会被自动部署。

实际应用中,应当让前端流程设计器生成指定格式的表单定义文件,通过与前文提到的接口方式,更新部署流程定义及表单定义资源。

获取及提交表单参数

实际上,渲染表单所需的所有数据都组装在下面两个方法:

StartFormData FormService.getStartFormData(String processDefinitionId)

TaskFormdata FormService.getTaskFormData(String taskId)

1

2

3

1

2

3

ProcessInstance FormService.submitStartFormData(String processDefinitionId, Map

properties)

void FormService.submitTaskFormData(String taskId, Map

properties)

网站数据信息

"flowable工作流,flowable6.7.2id没有前缀"浏览人数已经达到18次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:flowable工作流,flowable6.7.2id没有前缀的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!