1. 程式人生 > 實用技巧 >工作流任務節點按組分配

工作流任務節點按組分配

<?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:flowable="http://flowable.org/bpmn"
             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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"> <
process id="holley-group-test" name="zhl-group" isExecutable="true"> <documentation>分配組測試流程</documentation> <!-- 執行監聽器 可以捕獲的事件:1.流程例項的啟動和結束。2.流程執行轉移。3.活動的啟動和結束。4.閘道器的啟動和結束。5.中間事件的啟動和結束。6.啟動事件的結束,和結束事件的啟動。 <flowable:executionListener class="類名全路徑" event="start"/> 注意:這個類需要實現org.flowable.engine.delegate.ExecutionListener介面 <flowable:executionListener expression="${myPojo.myMethod(execution.event)}" event="end" /> 注意:execution.event將事件作為引數傳遞 執行監聽器也支援使用delegateExpression。 <flowable:executionListener event="start" delegateExpression="${myExecutionListenerBean}" />
--> <extensionElements> <flowable:executionListener class="com.insgeek.platform.event.holley.listener.MyExecutionListener" event="start"/> <!-- <flowable:eventListener events="ACTIVITY_COMPLETED" class="com.insgeek.platform.event.holley.listener.MyEventListener"/>--> </extensionElements> <!-- <extensionElements>--> <!-- <flowable:eventListener class="com.insgeek.platform.event.holley.listener.MyEventListener" />--> <!-- <flowable:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" />--> <!-- </extensionElements>--> <startEvent id="startEvent1"/> <userTask id="task-number-01" name = "${name}任務1" flowable:formFieldValidation="true" flowable:assignee="${holidayForm.name}"> <extensionElements> <flowable:formProperty id="days" expression="${days}" required="true" type="int" name="請假天數"/> <flowable:formProperty id="name" expression="${name}" required="true" name="請假天數"/> <flowable:formProperty id="id" expression="${id}" type="long" required="true" name="請假人id"/> </extensionElements> </userTask> <sequenceFlow id="line-number-01" sourceRef="startEvent1" targetRef="task-number-01"/> <!-- 服務任務: 注意: flowable:class="全路徑類名" 這個方法主要使用在service task中,此處作為測試 (指定實現了JavaDelegate或ActivityBehavior的類) 呼叫解析為委託物件(delegation object)的表示式 :delegateExpressionBean是一個實現了JavaDelegate介面的bean,定義在Spring容器中 <serviceTask id="serviceTask" flowable:delegateExpression="${delegateExpressionBean}" 呼叫方法表示式(method expression): 將在名為printer的物件上呼叫printMessage方法(不帶引數) <serviceTask id="javaService" name="My Java Service Task" flowable:expression="${printer.printMessage()}" /> 將在名為printer的物件上呼叫printMessage方法。傳遞的第一個引數為DelegateExecution,名為execution,在表示式上下文中預設可用。傳遞的第二個引數, 是當前執行中,名為myVar變數的值。 <serviceTask id="javaService" name="My Java Service Task" flowable:expression="${printer.printMessage(execution, myVar)}" /> 對值表示式(value expression)求值 會呼叫名為split的bean的ready引數的getter方法,getReady(不帶引數)。該物件會被解析為執行的流程變數或(如果可用的話)Spring上下文中的bean <serviceTask id="javaService" name="My Java Service Task" flowable:expression="${split.ready}" /> 只會為serviceTask上定義的Java類建立一個例項。所有流程例項共享同一個類例項,用於呼叫execute(DelegateExecution)。這意味著該類不能有任何成員變數, 並需要是執行緒安全的,因為它可能會在不同執行緒中同時執行。這也影響了欄位注入的使用方法。 flowable:class和flowable:delegateExpression支援欄位注入,如下: <extensionElements> <flowable:field name="text" stringValue="Hello World" /> </extensionElements> 對於較長文字: <extensionElements> <flowable:field name="text"> <flowable:string> This is a long string </flowable:string> </flowable:field></extensionElements> 另外,為避免XML太過冗長,可以將表示式設定為屬性,而不是子元素。 <flowable:field name="text1" expression="${genderBean.getGenderString(gender)}" /> <flowable:field name="text1" expression="Hello ${gender == 'male' ? 'Mr.' : 'Mrs.'} ${name}" /> --> <!-- 方法表示式(method expression)呼叫 bean中的方法--> <!-- 條件順序流: 條件順序流的XML表示格式為含有conditionExpression(條件表示式)子元素的普通順序流。 請注意目前只支援tFormalExpressions可以省略xsi:type=""定義,預設為唯一支援的表示式型別 目前conditionalExpressions只能使用UEL。使用的表示式需要能解析為boolean值,否則當計算條件時會丟擲異常。 這個例子通過典型的JavaBean的方式,使用getter引用流程變數的資料 <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${order.price > 100 && order.price < 250}]]> </conditionExpression> 這個例子呼叫了一個解析為boolean值的方法: <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${order.isStandardOrder()}]]> </conditionExpression> --> <sequenceFlow id="line-number-03" sourceRef="task-number-01" targetRef="task-number-03"/> <!-- 任務監聽器:用於在特定的任務相關事件發生時,執行自定義的Java邏輯或表示式。*只能*在流程定義中作為使用者任務的子元素 任務監聽器包含下列屬性: event(事件)(必填):觸發任務監聽器的任務事件型別。可用的事件有: create(建立):當任務已經建立,並且所有任務引數都已經設定時觸發。 assignment(指派):當任務已經指派給某人時觸發。請注意:當流程執行到達使用者任務時,在觸發create事件之前,會首先觸發assignment事件。 這順序看起來不太自然,但是有實際原因的:當收到create事件時,我們通常希望能看到任務的所有引數,包括辦理人。 complete(完成):當任務已經完成,從執行時資料中刪除前觸發。 delete(刪除):在任務即將被刪除前觸發。請注意任務由completeTask正常完成時也會觸發。 class:需要呼叫的委託類。這個類必須實現org.flowable.engine.delegate.TaskListener介面。 expression:(不能與class屬性一起使用):指定在事件發生時要執行的表示式。可以為被呼叫的物件傳遞DelegateTask物件與事件名(使用task.eventName)作為引數。 <flowable:taskListener event="create" expression="${myObject.callMethod(task, task.eventName)}" /> delegateExpression:指定一個能夠解析為TaskListener介面實現類的物件的表示式。與服務任務類似。 <flowable:taskListener event="create" delegateExpression="${myTaskListenerBean}" /> --> <userTask id="task-number-03" name="${name}任務2" flowable:candidateGroups="test,dev" > <!-- flowable:candidateUsers="user1,user2" 當使用候選人分配時,會建立一個任務,但是任務中的assignee的值為null。 而且如果同時配置flowable:assignee和flowable:candidateUsers,則只會建立flowable:assignee的任務 --> <extensionElements> <!-- 任務監聽器,可以在任務監聽器中動態分配使用者--> <flowable:taskListener event="complete" class="com.insgeek.platform.event.holley.listener.MyAssignmentHandlerTaskListener" /> <!-- 活動結束時執行監聽器--> <flowable:executionListener expression="${myExpressionExecutionListener.test(execution.eventName)}" event="end" /> </extensionElements> <!-- 指派具體使用者 --> <!-- <humanPerformer>--> <!-- <resourceAssignmentExpression>--> <!-- <formalExpression>test</formalExpression>--> <!-- </resourceAssignmentExpression>--> <!-- </humanPerformer>--> </userTask> <endEvent id="endEvent1"> <extensionElements> <flowable:executionListener class="com.insgeek.platform.event.holley.listener.MyEndExecutionListener" event="end"/> </extensionElements> </endEvent> <sequenceFlow id="line-number-06" sourceRef="task-number-03" targetRef="endEvent1"/> <!-- 多例項:閘道器與事件不能設定為多例項。 按照BPMN2.0規範的要求,用於為每個例項建立執行的父執行,會提供下列變數: nrOfInstances:例項總數。 nrOfActiveInstances:當前活動的(即未完成的),例項數量。對於順序多例項,這個值總為1。 nrOfCompletedInstances:已完成的例項數量。 可以呼叫execution.getVariable(x)方法獲取這些值。 每個被建立的執行,都有區域性變數(對其他執行不可見,也不儲存在流程例項級別) loopCounter:給定例項在for-each迴圈中的index。可以通過Flowable的elementIndexVariable屬性為loopCounter變數重新命名 --> </process> </definitions>

github地址 https://github.com/zhanghouli/flowable-demo