1. 程式人生 > >擴充套件Activiti流程定義檔案,實現自定義節點屬性

擴充套件Activiti流程定義檔案,實現自定義節點屬性

為了滿足業務需要,流程設計階段需對設計產物流程定義檔案中節點屬性進行擴充套件,譬如:任務是否支援退回、退回方式、退回的節點,任務轉派人、任務可跳轉的節點範圍等屬性資訊。為了保證擴充套件後的流程定義檔案能夠正常解析,我們採用類似<activiti:formProperty>元素的方式,模式如下:

<process id="extensionOperationProcess" name="The process which has extension operations" isExecutable="true">
	<startEvent id="start" name="Start"></startEvent>
	<sequenceFlow id="flow1" sourceRef="start" targetRef="operationTask"></sequenceFlow>
	<userTask id="operationTask" name="User task which has extension operations" activiti:assignee="admin">
		<extensionElements>
			<activiti:operations>
				<!-- 轉派: 將當前任務轉派給他人. 可配置屬性如下:
					transferTo 轉派任務接收人. 可為具體的人,也可為表示式;
				-->
				<activiti:transfer transferTo="admin" />
				<!-- 退回: 從當前節點退回到前序已執行的節點. 可配置屬性如下:
					backTo 可退回到的節點範圍,可以逗號間隔可選的節點. 為any時,表示可選任意前序的已執行節點. 預設值為與該節點緊鄰的上一個節點;
					returnBy 返回方式,可選"track"(原路返回),"flow"(重新流轉). 預設值為track;
				-->
				<activiti:turnback backTo="startevent1" returnBy="track" />
				<!-- 撤銷: 退回的反向操作?. 可配置屬性如下:
					gotoBy 前進方式,可選"track"(原路返回),"flow"(重新流轉). 預設值為track;
				-->
			</activiti:operations>
		</extensionElements>
	</userTask>
	<sequenceFlow id="flow2" sourceRef="operationTask" targetRef="usertask"></sequenceFlow>
	<userTask id="usertask" name="User Task" activiti:assignee="user"></userTask>
	<sequenceFlow id="flow3" sourceRef="usertask" targetRef="end"></sequenceFlow>
	<endEvent id="end" name="End"></endEvent>
</process>

流程定義檔案擴充套件之後,擴充套件的屬性如何儲存呢?我們知道在Activiti中ActivitiImpl物件儲存的是活動節點的定義,那麼我們即可在流程檔案解析時將擴充套件屬性通過setProperty方式儲存到 ActivitiImpl物件中。實現過程如下:

  • 自定義使用者任務解析控制類,該類實現將流程定義檔案中的擴充套件屬性設定給ActivitiImpl
  • 流程引擎配置中將自定義的使用者任務解析控制類,覆蓋掉預設的使用者任務解析控制類
  • public class ExtensionUserTaskParseHandler extends UserTaskParseHandler {
     
        @Override
        protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
            //呼叫上層的解析
            super.executeParse(bpmnParse, userTask);
     
            ActivityImpl activity = bpmnParse.getCurrentScope().findActivity(userTask.getId());
            Map<String, ExtensionOperation> operationMap = parseUserTaskOperations(bpmnParse, userTask);
     
            //將擴充套件屬性設定給activity
            activity.setProperty(ExtensionBpmnConstants.PROPERTY_OPERATIONS_DEFINITION, operationMap);
        }
     
        public Map<String, ExtensionOperation> parseUserTaskOperations(BpmnParse bpmnParse, UserTask userTask) {
            Map<String, ExtensionOperation> operationMap = new HashMap<String, ExtensionOperation>();
            //獲取擴充套件屬性標籤元素
            ExtensionElement operationsElement = userTask.getExtensionElements()
                                                         .get(ExtensionBpmnConstants.EXTENSION_ELEMENT_OPERATIONS);
     
            if (operationsElement != null) {
                for (ExtensionElement operationElement : operationsElement.getChildElements().values()) {
                    ExtensionOperation userTaskOperation = new ExtensionOperation(operationElement.getName());
     
                    if (operationElement != null && !operationElement.getAttributes().isEmpty()) {
                        for (ExtensionAttribute attributeElement : operationElement.getAttributes().values()) {
                            userTaskOperation.addProperty(attributeElement.getName(), attributeElement.getValue());
                        }
                    }
                    operationMap.put(operationElement.getName(), userTaskOperation);
                }
            }
     
            return operationMap;
        }
    }
  • 引擎配置:
  • <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    	<property name="processEngineName" value="activitiEngineInMemory" />
    	<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
    	<property name="jdbcDriver" value="org.h2.Driver" />
    	<property name="jdbcUsername" value="sa" />
    	<property name="jdbcPassword" value="" />
    	<!-- Database configurations -->
    	<property name="databaseSchemaUpdate" value="true" />
    	<!-- job executor configurations -->
    	<property name="jobExecutorActivate" value="false" />
    	<!-- mail server configurations -->
    	<property name="mailServerPort" value="5025" />
    	<property name="customDefaultBpmnParseHandlers">
    		<list>
    			<bean class="com.cayenne.bpm.engine.kernel.activiti.extension.bpmn.ExtensionUserTaskParseHandler" />
    		</list>
    	</property>
    </bean>
    完成上述設定後,即可通過 activity.getProperty(ExtensionBpmnConstants.PROPERTY_OPERATIONS_DEFINITION);獲取擴充套件的屬性值。