Flowable工作流入门

Flowable工作流入门

 

本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 

下载地址:Flowable下载

 

使用spring boot flowble生成所需表


    org.flowable
    flowable-spring-boot-starter
    6.4.2

不需配置启动项目即可

 

找到这几个war包rest除外

 

数据库分成两套

项目数据库:项目所需表和flowable通过jar包生成的表(34张)

Flowable数据库:用于流程图创建保存,测试,监控(74张)

项目部署只需项目数据库

可以使用flowable自带的流程一套工具为了降低耦合只是用流程图 bpmn

Tomcat配置flowable流程图

将4个war包复制到webapps目录下运行tomcat

配置:tomcat conf 目录的下context.xml

Server.xml 修改端口8080 改为8888(自定义防止使用和项目端口冲突)

找到以flowable开头目录的下flowable-default.properties

例如:\flowable-admin\WEB-INF\classes\flowable-default.properties

修改如下

将h2注释掉 (本人安装数据库是mysql8将驱动包复制到 tomcat目录下的lib中,8以下不需要导包)

选择所需数据库将注释解开

# Process engine        # CMMN engine         # App engine

# DMN engine         # Form engine             # Content engine

一共有6个端口都改成8888

默认密码不要修改(一改需要修改多了),通过运行起来再修改

特殊配置就一个

\flowable-admin\WEB-INF\classes\application-dev.properties

配置完成启动tomcat

访问http://localhost:8888/flowable-admin/

账户密码:admin test

主要负责监控,测试

重点是画流程图

http://localhost:8888/flowable-modeler/

创建流程

 

第一个按钮是保存(存档)对勾是验证是否配置正确

bpmn导出

点击查询按钮

 

 

 

数据库表介绍

Flowable的数据库名称都以ACT_开头。第二部分是表的用例的双字符标识。此用例也将大致匹配服务API。

ACT_RE_ *:RE代表repository。具有此前缀的表包含静态信息,例如流程定义和流程资源(图像,规则等)。

ACT_RU_ *:RU代表runtime。这些是包含流程实例,用户任务,变量,作业等的运行时数据的运行时表。Flowable仅在流程实例执行期间存储运行时数据,并在流程实例结束时删除记录。这使运行时表保持小而快。

ACT_HI_ *:HI代表history。这些是包含历史数据的表,例如过去的流程实例,变量,任务等。

ACT_GE_ *:general数据,用于各种用例。

 

事件监听器实现

事件监听器的唯一要求是实现org.flowable.engine.delegate.event.FlowableEventListener。下面是一个侦听器的示例实现,它将收到的所有事件输出到标准输出,但与作业执行相关的事件除外:

public class MyEventListener implements FlowableEventListener {
 
@Override
 
    public void onEvent(FlowableEvent event) {
 
        if (event.getType().equals(FlowableEngineEventType.JOB_EXECUTION_SUCCESS)) {
 
            System.out.println("一个任务执行成功");
 
        } else if (event.getType().equals(FlowableEngineEventType.JOB_EXECUTION_FAILURE)) {
 
            System.out.println("一个任务执行失败");
 
        } else  {
 
            System.out.println(event.getType());
 
        }
 
    }
 
   //该isFailOnException()方法确定onEvent(..)方法在调度事件时抛出异常时的行为。
 
   // 当false返回,异常被忽略。当true返回,异常不会被忽略
 
    @Override
    public boolean isFailOnException() {
        return false;
    }
//该isFireOnTransactionLifecycleEvent()方法确定此事件侦听器是在事件发生时立即触发还是由 
// getOnTransaction()方法确定的事务生命周期事件触发。
//支持的事务生命周期事件的值是:COMMITTED,ROLLED_BACK,COMMITTING,ROLLINGBACK。
 
    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }
 
 
 
    @Override
    public String getOnTransaction() {
        return null;
    }
 
}
    

 

基础类的监听

org.flowable.engine.delegate.event.BaseEntityEventListener

一个事件侦听器基类,可用于侦听特定类型的实体或所有实体的实体相关事件。它隐藏掉类型检查,并提供4种方法应覆盖:onCreate(..),onUpdate(..)并onDelete(..)创建实体时,更新或删除。对于所有其他与实体相关的事件,onEntityEvent(..) 调用它

 

运行的监听器

通过RuntimeService调用

添加监听器
void addEventListener(FlowableEventListener listenerToAdd);
添加监听器并指定类型
void addEventListener(FlowableEventListener listenerToAdd, FlowableEventType... types);
删除监听器
void removeEventListener(FlowableEventListener listenerToRemove);
下面列出了引擎中可能出现的所有事件类型。每种类型对应于中的枚举值org.flowable.engine.common.api.delegate.event.FlowableEventType

所有ENTITY_\*事件都与引擎内的实体相关

ENTITY_CREATED, ENTITY_INITIALIZED, ENTITY_DELETED:附件,注释,部署,执行,组,IdentityLink,作业,模型,ProcessDefinition,ProcessInstance,任务,用户。

ENTITY_UPDATED:附件,部署,执行,组,IdentityLink,作业,模型,ProcessDefinition,ProcessInstance,任务,用户。

ENTITY_SUSPENDED, ENTITY_ACTIVATED:ProcessDefinition,ProcessInstance / Execution,Task。

Process engine API和服务
 

重点7大接口

RepositoryService
主要是关于静态信息(数据不会改变,或者至少不是很多)

查询引擎已知的部署和流程定义。

暂停和激活整个部署或特定流程定义。暂停意味着不能对它们执行进一步的操作,而激活则相反并且再次启用操作。

检索各种资源,例如部署中包含的文件或引擎自动生成的流程图。

检索流程定义的POJO版本,该版本可用于使用Java而不是XML来内省流程

RuntimeService
但RuntimeService恰恰相反。它涉及启动流程定义的新流程实例。

TaskService
需要由系统的用户执行的任务是BPM引擎(如Flowable)的核心。围绕任务的所有内容都在TaskService中进行分组:

查询分配给用户或组的任务

创建新的独立任务。这些是与流程实例无关的任务。

操作分配任务的用户或以某种方式参与任务的用户。

声称并完成任务。声称意味着某人决定成为该任务的受让人,这意味着该用户将完成该任务。完成意味着完成任务的工作。通常,这是填写各种形式。

IdentityService
它支持组和用户的管理(创建,更新,删除,查询......)。

formService
是一个可选的服务,将flowable里的表单关联到dpmn中(不使用)。

HistoryService:
暴露了可流动的引擎收集的所有历史数据例如流程实例启动时间,执行哪些任务,完成任务所需的时间,每个流程实例中遵循的路径,等等。此服务主要公开查询功能以访问此数据。

ManagementService
该ManagementService编码使用可流动的自定义应用程序时,通常是没有必要的。它允许检索有关数据库表和表元数据的信息。此外,它还公开了作业的查询功能和管理操作。Flowable中的作业用于各种事物,例如计时器,异步延续,延迟暂停/激活等。稍后,将更详细地讨论这些主题。

DynamicBpmnService(多出来特殊的一个)
可以用来改变流程定义的一部分,而无需重新部署。例如,您可以更改流程定义中用户任务的受理人定义,或更改服务任务的类名称。

 

ProcessEngines.getDefaultProcessEngine()将在第一次调用时初始化并构建流程引擎,之后始终返回相同的流程引擎。可以使用ProcessEngines.init() 和完成所有流程引擎的正确创建和关闭ProcessEngines.destroy()

异常
org.flowable.engine.FlowableException

FlowableWrongDbException:当Flowable引擎发现数据库架构版本与引擎版本不匹配时抛出。

FlowableOptimisticLockingException:在由同一数据条目的并发访问引起的数据存储中发生乐观锁定时抛出。

FlowableClassLoadingException:在未找到请求加载的类或加载时发生错误(例如JavaDelegates,TaskListeners,...)时抛出。

FlowableObjectNotFoundException: Thrown when an object that is requested or actioned does not exist.

FlowableIllegalArgumentException:一个异常,指示在Flowable API调用中提供了非法参数,在引擎配置中配置了非法值,或者提供了非法值,或者在流程定义中使用了非法值。

FlowableTaskAlreadyClaimedException:当已经声明任务时,在taskService.claim(…​)被调用时抛出。

查询API
有两种方法可以从引擎查询数据:查询API和本机查询。

API查询
List list = taskService.createTaskQuery().taskAssignee("")
.processVariableValueEquals("orderId", "0851").orderByTaskDueDate().asc().list();
本地查询
List tasks = taskService.createNativeTaskQuery()
.sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) +
 
        " T WHERE T.NAME_ = #{taskName}")
 
.parameter("taskName", "gonzoTask")
 
.list();
long count = taskService.createNativeTaskQuery()
 
        .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, " +
 
                managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_")
 
        .count();
 

持久变量
每个流程实例都需要并使用数据来执行由它组成的步骤。在Flowable中,此数据称为变量,存储在数据库中。变量可以在表达式中使用(例如,在独占网关中选择正确的传出顺序流),在调用外部服务时的Java服务任务中(例如,提供输入或存储服务调用的结果),等等上。流程实例可以包含变量(称为流程变量),但也可以包含执行(指向流程活动位置的特定指针),用户任务可以包含变量。流程实例可以包含任意数量的变量。每个变量都存储在ACT_RU_VARIABLE数据库表的一行中。

所有startProcessInstanceXXX方法都有一个可选参数,用于在创建和启动流程实例时提供变量。例如,从RuntimeService:

runtimeService.startProcessInstanceById("");

瞬时变量
瞬态变量是行为类似于常规变量的变量,但不是持久变量。通常,瞬态变量用于高级用例。

瞬态变量根本没有存储历史记录。

瞬态变量只能通过setTransientVariable(name,value)设置,但在调用getVariable(name)时也会返回瞬态变量(getTransientVariable(name)也存在,只检查瞬态变量)。这样做的原因是使表达式的编写变得容易,并且使用变量的现有逻辑适用于这两种类型。

瞬态变量会影响具有相同名称的持久变量。这意味着当在流程实例上设置持久变量和瞬态变量并且调用getVariable(“someVariable”)时,将返回瞬态变量值。

 

例子:

假设Fetch Data服务任务调用一些远程服务(例如,使用REST)。我们还假设需要一些配置参数,并且在启动流程实例时需要提供这些参数。此外,这些配置参数对于历史审计目的并不重要,因此我们将它们作为瞬态变量传递:

 

表达式
Flowable使用UEL进行表达式解析。UEL代表统一表达语言,是EE6规范的一部分

表达式可用于例如Java服务任务,执行监听器,任务监听器和条件序列流

 

值表达式:
解析为值

$ {myVar}

$ {myBean.myProperty}

 

方法表达式:
调用带或不带参数的方法。在调用不带参数的方法时,请务必在方法名称后面添加空括号(因为这会将表达式与值表达式区分开来)。传递的参数可以是文字值或自己解析的表达式。

$ {printer.print()}

$ {myBean.addNewOrder ('orderName')}

$ {myBean.doSomething (myVar,execution)}

 

表达式函数
变量:get(varName)
例如,如果myVariable不存在,$ {myVariable ==“hello”}将抛出异常,但$ {var:get(myVariable)== hello }将起作用。

变量:getOrDefault(varName, defaultValue)
类似于get,但可以选择提供默认值,该值在未设置变量或值为null时返回。

变量:exists(varName)
如果变量具有非null值,则返回true。

变量:isEmpty(varName)
检查变量值是否为空。根据变量类型,行为如下

对于String变量,如果变量为空字符串,则该变量被视为空。

对于java.util.Collection变量,如果集合没有元素,则返回true。

对于ArrayNode变量,如果没有元素,则返回true

如果变量为null,则始终返回true

变量:isNotEmpty(varName)
不为null返回true

变量:equals(varName,value)
检查变量是否等于给定值。否则将写为$ {execution.getVariable(“varName”)!= null && execution.getVariable(“varName”)== value}

变量:notEquals(varName,value)
equals的反向比较。

变量:contains(varName,value1,value2,...)
检查提供的所有值是否包含在变量中

对于String变量,传递的值用作需要作为变量一部分的子字符串

对于java.util.Collection变量,所有传递的值都需要是集合的元素(常规包含语义)。

对于ArrayNode变量:支持检查arraynode是否包含作为变量类型支持的类型的JsonNode

当变量值为null时,在所有情况下都返回false。当变量值不为null,并且实例类型不是上述类型之一时,将返回false。

变量:containsAny(varName,value1,value2,...)
类似于contains函数,但如果传递的值中包含任何(而不是全部)传递值,则返回true。

 

比较器功能:

变量:lowerThan(varName,value)(别名:lessThan或 :lt):

${execution.getVariable("varName") != null && execution.getVariable("varName") < value}

变量:lowerThanOrEquals(varName,value)(别名:lessThanOrEquals或:lte):相似,但现在为<=

变量:greaterThan(varName,value)(别名:gt):类似,但现在为>

变量:greaterThanOrEquals(varName,value)(别名:gte):相似,但现在为> =

 

Flowable 工作流 问题汇总

本文链接:https://blog.csdn.net/fwk19840301/article/details/98939750

官网地址:https://www.flowable.org/

插件地址:http://www.flowable.org/designer/update/ 

用户手册地址:https://tkjohn.github.io/flowable-userguide/


一、Bpmn常用节点

1、Task任务:

用户任务(userTask)

系统任务(serviceTask )

2、Event事件:

定时器事件(timerEventDefinition)

3、Gateway网关:

排他网关(exclusive gateway)

二、关键字段

1、procInstId 流程实例Id

2、taskId 任务Id

3、executionId 执行Id

总结一下,如果形象的拿procInstId,executionId,taskId做一个比喻的话,procInstId为一个面,executionId为在面上的一条线,taskId为在线上的一个点。

4、processDefinitionId (w10:9:b06e3e66-bb55-11e9-97c7-c485089b220a)流程定义Id

通过DEPLOYMENT_ID 关联 aff565df-bb55-11e9-97c7-c485089b220a (多对一)

5、processDefinitionKey(就是xml 定义的key: w10) 流程定义Key

6、processDefinitionName (w10#1)流程定义名称

后边三个是在xml中配置的

	

发起一个流程:

利用方法  repositoryService.createProcessDefinitionQuery().processDefinitionKey(key) .latestVersion().singleResult()

从act_re_procdef  表中取出processDefinitionId ,variables为变量的map执行此方法

(通过flowable提供的接口runtimeService中的startProcessInstanceBy**去发起)

ProcessInstance startProcessInstanceById(String processDefinitionId, Map variables);

 执行完以上语句会返回procInstId 流程实例Id

三、其他情况

1.bpmn流程图后缀

其中资源后缀的定义如下:

 public static final String[] BPMN_RESOURCE_SUFFIXES = new String[]{"bpmn20.xml", "bpmn"};

也就是说我们必须以这2个格式结束,否则无法加入流程中。

以bpmn或者bpmn20.xml结尾

2.如果没有自动创建出整个表

原因:isEngineTablePresent(是否从新创建表)

可以看到使用的是表ACT_RU_EXECUTION是否存在来判断的,可能别的数据库中有这个表

3.流程表:ACT_RE_PROCDEF 为空

其中资源后缀的定义如下:

 public static final String[] BPMN_RESOURCE_SUFFIXES = new String[]{"bpmn20.xml", "bpmn"};

必须以这bpmn或者bpmn20.xml结尾,否则无法加入流程中。

4.监听器(user Task)类型:


public interface BaseTaskListener extends Serializable {

String EVENTNAME_CREATE = "create";
String EVENTNAME_ASSIGNMENT = "assignment";
String EVENTNAME_COMPLETE = "complete";
String EVENTNAME_DELETE = "delete";


/**
 * Not an actual event, used as a marker-value for {@link BaseTaskListener}s that 
   should be called for all events, including {@link #EVENTNAME_CREATE} , {@link 
   #EVENTNAME_ASSIGNMENT} and
 * {@link #EVENTNAME_COMPLETE} and {@link #EVENTNAME_DELETE}.
 */
 String EVENTNAME_ALL_EVENTS = "all";
 
}


public interface TaskListener extends BaseTaskListener {
    void notify(DelegateTask delegateTask);
}

(1)create:任务创建时,并且所有的属性都被设置好后,进入该回调。
(2)assignment:任务被委派给某人后.。注意: 当流程执行到达一个userTask时。
(3)complete:在任务完成后,且被从运行时数据(runtime data)中删除前触发。
(4)delete:在任务将要被删除之前发生。注意,当任务通过completeTask完成任务时,它也会被执行。
 

5.assignment任务被委派给某人

{

"approved": false,

"assignee": "ZHANGSAN",

"comment": "委派给张三",

"processId": "f2056621-be97-11e9-ba31-c485089b220a",

"reassigned": true,

"taskId": "f27f0303-be97-11e9-ba31-c485089b220a"

}

 代码如下:

if (review.reassigned) {

    if (Strings.isNullOrWhitespace(review.getAssignee())) {

        throw new NoAssigneeException();

    }

    engineTaskService.setAssignee(taskId, review.getAssignee());

}

7 *.bpmn20.xml 修改后不生效

a,有xml报错,会造成ACT_GE_BYTEARRAY不更新(旧的有效)

8.eclipse flowable插件

导入项目,注意选择maven 选择General

Flowable工作流入门_第1张图片

安装插件

Flowable工作流入门_第2张图片

Name: Flowable BPMN 2.0 designer

Location: http://flowable.org/designer/update/

Flowable工作流入门_第3张图片

安装完毕后打开

Flowable工作流入门_第4张图片

 Flowable工作流入门_第5张图片

7.修改bpmn流程图

Flowable工作流入门_第6张图片

Flowable工作流入门_第7张图片

Flowable工作流入门_第8张图片

 

 

参考链接:https://blog.csdn.net/qq_37059838/article/details/83615260

 

你可能感兴趣的:(Flowable工作流入门)