• flowable工作流笔记


    专业词汇
    处理分发的事件的另一个方法,是抛出BPMN事件实体entityType可用的值有:attachment(附件), comment(备注), execution(执行), identity-link(身份关联), job(作业), process-instance(流程实例), process-definition(流程定义), task(任务)。throwEvent="globalSignal"

    流程定义的xml

    文档位置:2.3.2. 部署流程定义

    <?xml version="1.0" encoding="UTF-8"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
      xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
      xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
      xmlns:flowable="http://flowable.org/bpmn"
      typeLanguage="http://www.w3.org/2001/XMLSchema"
      expressionLanguage="http://www.w3.org/1999/XPath"
      targetNamespace="http://www.flowable.org/processdef">
    
      <process id="holidayRequest" name="Holiday Request" isExecutable="true">
    
        <startEvent id="startEvent"/>
        <sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>
    
        <userTask id="approveTask" name="Approve or reject request"/>
        <sequenceFlow sourceRef="approveTask" targetRef="decision"/>
    
        <exclusiveGateway id="decision"/>
        <sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
          <conditionExpression xsi:type="tFormalExpression">
            <![CDATA[
              ${approved}
            ]]>
          </conditionExpression>
        </sequenceFlow>
        <sequenceFlow  sourceRef="decision" targetRef="sendRejectionMail">
          <conditionExpression xsi:type="tFormalExpression">
            <![CDATA[
              ${!approved}
            ]]>
          </conditionExpression>
        </sequenceFlow>
    
        <serviceTask id="externalSystemCall" name="Enter holidays in external system"
            flowable:class="org.flowable.CallExternalSystemDelegate"/>
        <sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>
    
        <userTask id="holidayApprovedTask" name="Holiday approved"/>
        <sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>
    
        <serviceTask id="sendRejectionMail" name="Send out rejection email"
            flowable:class="org.flowable.SendRejectionMail"/>
        <sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>
    
        <endEvent id="approveEnd"/>
    
        <endEvent id="rejectEnd"/>
    
      </process>
    
    </definitions>

    1.选用mysql数据库的时候选择5.6.4及其以上,如果要较低版本的flowalbe支持比较高的mysql,需要加入如下配置:
    要进行升级,首先需要将下列配置参数放入你的flowable.cfg.xml配置文件:

    <beans > 
    <bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <!-- ... --> <property name="databaseSchemaUpdate" value="true" />
    <!-- ... --> </bean>
    </beans>

    同时需要改驱动

    2.选择flowable版本6.0.1版本及其 以上较好性能。
    开启异步执行器配置(async executor)获得较好性能

    <property name="asyncExecutorActivate" value="true" />

    3.从Flowable 6.1.0起,添加了异步历史功能,需要在配置文件中开启

    4.默认情况下,Flowable引擎依赖中不提供SFL4J绑定JAR。你需要自行将其加入你的项目,以便使用所选的日志框架。如果没有加入实现JAR,SLF4J会使用NOP-logger,需要写上版本号

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

    5.重要章节 3.18

    对事件监听器的唯一要求,是要实现org.flowable.engine.delegate.event.FlowableEventListener接口

    在配置文件中配置:

    <bean id="processEngineConfiguration"
        class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        ...
        <property name="eventListeners">
          <list>
             <bean class="org.flowable.engine.example.MyEventListener" />
          </list>
        </property>
    </bean>
    public class MyEventListener implements FlowableEventListener {
    
      @Override
      public void onEvent(FlowableEvent event) {
        switch (event.getType()) {
    
          case JOB_EXECUTION_SUCCESS:
            System.out.println("A job well done!");
            break;
    
          case JOB_EXECUTION_FAILURE:
            System.out.println("A job has failed...");
            break;
    
          default:
            System.out.println("Event received: " + event.getType());
        }
      }
    
      @Override
      public boolean isFailOnException() {
        // onEvent方法中的逻辑并不重要,可以忽略日志失败异常……
    
        return false;
      }
    }

    onEvent(..)方法抛出异常,如果isFailOnException()返回false,将不做额外处理,即不向上抛异常。若返回true,异常不会被忽略而会被上抛,使当前执行的命令失败。如果事件是API调用(或其他事务操作,例如作业执行)的一部分,事务将被回滚。如果事件监听器中并不是重要的业务操作,建议返回false

    提供了一些实现类,例如:

    org.flowable.engine.delegate.event.BaseEntityEventListener: 事件监听器基类,可用来监听实体(entity)相关事件,特定或所有实体的事件都可以。它隐藏了类型检测,提供了4个需要覆盖的方法:onCreate(..), onUpdate(..)onDelete(..)在实体创建、更新及删除时调用;对所有其他实体相关事件,onEntityEvent(..)会被调用

       各类监听器配置

    1.通用监听器(所以事件都会触发,例如JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE等等),

    eventListeners这个关键字来指定,粉红色部分。
    <bean id="processEngineConfiguration"
        class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        ...
        <property name="eventListeners">
          <list>
             <bean class="org.flowable.engine.example.MyEventListener" />
          </list>
        </property>
    </bean>

    2.特定事件监听器:

    typedEventListeners这个关键字来指定,粉红色部分。指定了:JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE
    <bean id="processEngineConfiguration"
        class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        ...
        <property name="typedEventListeners">
          <map>
            <entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
              <list>
                <bean class="org.flowable.engine.example.MyJobEventListener" />
              </list>
            </entry>
          </map>
        </property>
    </bean>

    最后监听的顺序是安装list来监听的。

    3.为流程定义增加监听器

    下面的代码片段为流程定义增加了2个监听器。第一个监听器接收任何类型的事件,使用完全限定类名定义。第二个监听器只在作业成功执行或失败时被通知,使用流程引擎配置中beans参数定义的bean作为监听器。

    <process id="testEventListeners">
      <extensionElements>
        <flowable:eventListener class="org.flowable.engine.test.MyEventListener" />
        <flowable:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" />
      </extensionElements>
    
      ...
    
    </process>

    实体相关的事件(请假就是一个实体,下面例子即是请假创建:ENTITY_CREATED)也可以在流程定义中增加监听器,只有在特定实体类型的事件发生时得到通知。下面的代码片段展示了如何设置。可以响应实体的所有事件(第一个例子),或只响应实体的特定类型事件(第二个例子)。

    <process id="testEventListeners">
      <extensionElements>
        <flowable:eventListener class="org.flowable.engine.test.MyEventListener" entityType="task" />
        <flowable:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" />
      </extensionElements>
    
      ...
    
    </process>
    关于流程定义监听器的说明(不是很懂)
    • 事件监听器只能作为extensionElements的子元素,声明在process元素上。不能在个别节点(activity)上定义(事件)监听器。

    • delegateExpression中的表达式,与其他表达式(例如在网关中的)不一样,不可以访问执行上下文。只能够引用在流程引擎配置中beans参数定义的bean;或是在使用spring(且没有定义beans参数)时,引用任何实现了监听器接口的spring bean。

    • 使用监听器的class属性时,只会创建唯一一个该类的实例。请确保监听器实现不依赖于成员变量,或确保多线程/上下文的使用安全。

    • 如果events属性使用了不合法的事件类型,或者使用了不合法的throwEvent值,会在流程定义部署时抛出异常(导致部署失败)。如果classdelegateExecution指定了不合法的值(不存在的类,不存在的bean引用,或者代理类没有实现监听器接口),在流程启动(或该流程定义的第一个有效事件分发给这个监听器)时,会抛出异常。请确保引用的类在classpath中,并且保证表达式能够解析为有效的实例。

  • 相关阅读:
    开发笔记--git代码回退,撤回到上一个版本
    开发笔记--Navicat导出postgresql表结构数据成excel文件
    使用Aspose.Words组件给word加水印
    JSON JavaScriptSerializer 字符串的长度超过了为 maxJsonLength 属性设置的值。
    http content-type详解
    Linux CPU使用率超过100%的原因
    Qt查找依赖库的简单方法及如何简便地在pro中添加依赖库
    OSI七层网络模型分别是哪七层?各运行那些协议?
    配置文件管理
    Java中日期转json时日期格式转换
  • 原文地址:https://www.cnblogs.com/longsanshi/p/12669024.html
Copyright © 2020-2023  润新知