擴展Activiti流程定義文件,實現自定義節點屬性

      爲了知足業務須要,流程設計階段需對設計產物流程定義文件中節點屬性進行擴展,譬如:任務是否支持退回、退回方式、退回的節點,任務轉派人、任務可跳轉的節點範圍等屬性信息。爲了保證擴展後的流程定義文件可以正常解析,咱們採用相似<activiti:formProperty>元素的方式,模式以下: java

<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;
    }
}

引擎配置: ide

<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);獲取擴展的屬性值。
相關文章
相關標籤/搜索