扩展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);获取扩展的属性值。


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
扩展 Activiti UserTask 节点实现自定义节点属性,可以按照以下步骤进行: 1. 创建一个 Java 类来扩展 UserTask 节点。该类需要继承 org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior 类。 例如: ``` public class CustomUserTaskBehavior extends UserTaskActivityBehavior { // 自定义节点属性 } ``` 2. 在该类中添加自定义节点属性。 例如: ``` public class CustomUserTaskBehavior extends UserTaskActivityBehavior { private String customAttribute; public void setCustomAttribute(String customAttribute) { this.customAttribute = customAttribute; } public String getCustomAttribute() { return customAttribute; } } ``` 3. 创建一个 BpmnParseHandler 类来解析扩展属性。该类需要继承 org.activiti.engine.impl.bpmn.parser.AbstractBpmnParseHandler 类。 例如: ``` public class CustomUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<UserTask> { @Override protected Class<? extends BaseElement> getHandledType() { return UserTask.class; } @Override protected void executeParse(BpmnParse bpmnParse, UserTask userTask) { CustomUserTaskBehavior customUserTaskBehavior = new CustomUserTaskBehavior(); // 解析自定义节点属性 String customAttribute = userTask.getAttributes().getValue("customAttribute"); customUserTaskBehavior.setCustomAttribute(customAttribute); userTask.setBehavior(customUserTaskBehavior); } } ``` 4. 在流程引擎配置中注册 BpmnParseHandler 类。 例如: ``` ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); configuration.setCustomDefaultBpmnParseHandlers(Collections.singletonList(new CustomUserTaskBpmnParseHandler())); ``` 现在,你已经成功扩展Activiti UserTask 节点实现自定义节点属性。在 BPMN 文件中,你可以使用自定义属性来配置 UserTask 节点,例如: ``` <userTask id="task1" name="Task 1" activiti:assignee="john" customAttribute="customValue"></userTask> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值