activiti获取流程图中的所有信息包括变量名

今天在看activiti的变量的时候,都是由用户来设置变量,我们在后台写代码通过变量设置或取一些参数的时候,非常的不方便。

比如:设置变量的时候通过页面设置

设置之后,我们如何动态的给这个变量设置参数,我参考了好多资料,大部分都是直接进行的设置,比如:

Map<String, Object> variables = new HashMap<String, Object>(); variables.put("userIDs", "大大,中中,小小");

这样子的话就相当于把变量名设置死了,非常的不方便。那我们能不能动态的获取这个变量名,然后进行设参和取参呢?下面我们举个例子来详解:

在activti中有一个对象Process,封装了全部的节点、连线、以及关口等信息。我们可以通过这个对象获取流元素信息process.getFlowElements();

比如我们上面在一个任务节点中设置了一个用户组的变量,如何来获取这个变量呢,下面上代码

/**
	 * 获取流程图中的所有信息包括变量名
	 * @param processDefinitionId
	 */
	@Test
    public void a() {
		String processDefinitionId = "这里是流程定义ID";
		Map<String,Object> map = new HashMap<String,Object>();
		//获取bpmnModel对象
		BpmnModel model1 = repositoryService.getBpmnModel(processDefinitionId);
	//	BpmnModel model1 = new BpmnJsonConverter().convertToBpmnModel(modelNode);
		//由于我们这里仅仅定义了一个Process 所以获取集合中的第一个就可以
		//Process对象封装了全部的节点、连线、以及关口等信息。拿到这个对象就能够为所欲为了。
		Process process = model1.getProcesses().get(0);
		//获取全部的FlowElement(流元素)信息
		Collection<FlowElement> flowElements = process.getFlowElements();
		for (FlowElement flowElement : flowElements) {
			//假设是开始节点
			if(flowElement instanceof StartEvent){
				StartEvent startEvent = (StartEvent)flowElement;
				map.put("startEvent", startEvent);
			}
			//假设是任务节点
			if(flowElement instanceof UserTask) {
				UserTask userTask = (UserTask)flowElement;
				List<String> candidateUsers = userTask.getCandidateUsers();
				for (String string : candidateUsers) {
					System.out.println("-------"+string);
				}
				map.put("userTask", userTask);
			}
			//假设是结束节点
			if(flowElement instanceof EndEvent) {
				EndEvent endEvent = (EndEvent)flowElement;
				map.put("endEvent", endEvent);
			}
			//假设是连接线
			if(flowElement instanceof SequenceFlow) {
				SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
				map.put("sequenceFlow", sequenceFlow);
			}
		}
	}

定义了一个map,把所有的节点对象都存入进去,每个节点对象中都封装了各自节点的全部信息,这些信息都对应着我们部署的xml文件,我们在进行调用的时候想用哪个对象就用哪个对象,这样子是不是很方便,来看一下运行代码的结果,是否会输出获取到的任务节点的变量名:

-------#{UserIds}
-------#{UserIds}  

获取到了,没问题,因为我在两个任务节点上都设置了相同的变量名所有出现了2次。其余的变量设置也是一样的,这里就只演示一下任务的变量名,其他的信息获取也是一样的,都在对象中包括咯。

这样子的话,我们以后在设置变量信息或者取的时候,就直接就可以获取到变量名来操作,是不是很灵活了。

猜你喜欢

转载自www.cnblogs.com/shijianhenjinpo/p/9240182.html
今日推荐