flowable工作流进阶(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37059838/article/details/83615260

Flowable spring boot 进阶(二)

数据库表介绍

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(..) 调用它

扫描二维码关注公众号,回复: 4465181 查看本文章

 

运行的监听器

通过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<Task> list = taskService.createTaskQuery().taskAssignee("")

.processVariableValueEquals("orderId", "0851")

.orderByTaskDueDate().asc().list();

本地查询

List<Task> 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):相似,但现在为> =

猜你喜欢

转载自blog.csdn.net/qq_37059838/article/details/83615260