1. 程式人生 > >activiti 配置節點 連線信息獲取

activiti 配置節點 連線信息獲取

println clas data res dbi 輸出 轉換 個人 ack

1.1.1.?前言

當使用eclipse插件進行流程設計的時候,部署流程之後,我們怎樣獲取我們定義的全部的節點、連線、關口等配置信息呢?有的人看到這個需求,不免竊喜。這不非常easy嘛,又一次打來bmpn中定義的xml信息,查看不就完了,確實這樣的方式是可取的,可是當我們的項目流程在啟動的時候,我們想要獲取定義的信息的時候,換言之就是 我們能動態的讀取裏面的信息反饋給系統用戶的時候,我們該怎樣獲取呢?總不能告訴用戶你去打開xml文件自己去查看,用戶未必能看懂裏面的xml定義信息吧。

這樣的方式不是添加了用戶操作難度,還要找個人培訓用戶吧。那所以我們該怎樣提供一個接口,讓用戶須要看的時候,點擊一個button。就能一目了然的看到配置的信息呢,這是其一,第二:我們怎樣能夠獲取到一個任務的出線信息。動態的渲染到頁面,讓用戶操作呢?舉一個簡單的樣例,a任務節點有三根出線、出線1 出線2、出線3、當用戶查詢代辦信息的時候,我們怎麽把當前a任務節點的3個出線渲染到頁面,讓用戶決定下一個流程的去向。第三:還是上面的樣例,a用戶選擇不同的出線信息就決定了流程的不同運轉軌跡,由於activiti 工作流就是靠線上的表達式運轉的,那怎麽能在用戶選擇的時把線上配置的表達式獲取到呢?還是上面的問題,總不能告訴用戶你選擇a出線輸入a=1表達式。選擇2出線輸入a=2表達式。這樣的方式操作不方便。也是不可取的。所以以下我們將具體的解說怎樣獲取配置文件的節點信息。

1.1.2.?流程的定義

定義一個流程流程的具體定義例如以下:

?技術分享圖片

Xml的配置信息例如以下所看到的:

<?

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:activiti="http://activiti.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="daling"> <process id="daling" name="name_daling" isExecutable="true" activiti:candidateStarterUsers="a,b,c,d"> <startEvent id="startevent1" name="Start"></startEvent> <userTask id="usertask1" name="usertask1審批" activiti:candidateGroups="1,2"> <documentation>usertask1審批</documentation> </userTask> <userTask id="usertask2" name="usertask2審批" activiti:candidateUsers="b,c"></userTask> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow1" name="flow1" sourceRef="startevent1" targetRef="usertask1"> <documentation>flow1連線</documentation> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${a==2}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" name="flow2" sourceRef="usertask1" targetRef="usertask2"> <documentation>usertask1審批出線</documentation> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${a==1}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_daling"> <bpmndi:BPMNPlane bpmnElement="daling" id="BPMNPlane_daling"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="10.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> <omgdc:Bounds height="55.0" width="105.0" x="280.0" y="192.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="340.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="247.0" y="45.0"></omgdi:waypoint> <omgdi:waypoint x="352.0" y="110.0"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="14.0" width="100.0" x="247.0" y="45.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="352.0" y="165.0"></omgdi:waypoint> <omgdi:waypoint x="332.0" y="192.0"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="14.0" width="100.0" x="352.0" y="165.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="332.0" y="247.0"></omgdi:waypoint> <omgdi:waypoint x="247.0" y="340.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>



流程定義完了就開始部署測試怎樣獲取節點的信息:

當一個流程xml部署的時候,看看數據庫表的變化後面可能用到。比較熟悉表結構的同誌們就忽略繼續向下看吧。

部署的時候ACT_GE_BYTEARRAY表會變化,具體例如以下圖所看到的:

?技術分享圖片

ACT_GE_PROPERTY表會變化吧。生成next.dbid

ACT_RE_PROCDEF會變化,由於定義的部署流程信息。

好了表的關系大致了解下,看以下我們怎樣獲取節點配置信息demo吧。

?

1.1.3.?代碼獲取

ProcessEnginesDemo demo = new ProcessEnginesDemo();
RepositoryService repositoryService2 = demo.getRepositoryService();
//processDefinitionId 相應表ACT_RE_PROCDEF主鍵信息
String processDefinitionId="daling:5:30004";
//獲取bpmnModel對象
BpmnModel bpmnModel = repositoryService2.getBpmnModel(processDefinitionId);
//由於我們這裏僅僅定義了一個Process 所以獲取集合中的第一個就可以
Process process = bpmnModel.getProcesses().get(0);
//獲取全部的FlowElement信息
Collection<FlowElement> flowElements = process.getFlowElements();
for (FlowElement flowElement : flowElements) {
//假設是任務節點
if (flowElement instanceof UserTask) {
UserTask userTask=(UserTask) flowElement;
//獲取入線信息
List<SequenceFlow> incomingFlows = userTask.getIncomingFlows();
for (SequenceFlow sequenceFlow : incomingFlows) {
System.out.println(sequenceFlow.getId() +"-"+sequenceFlow.getConditionExpression()+"--"+sequenceFlow.getDocumentation()+"-"
+sequenceFlow.getSourceRef()+"--"+sequenceFlow.getTargetRef()+"-");
}
}
}


程序的輸出例如以下所看到的:

flow1-${a==2}--flow1連線-startevent1--usertask1-

flow2-${a==1}--usertask1審批出線-usertask1--usertask2

上面的代碼。我們也能看出來主要是獲取BpmnModel中的Process對象。Process對象封裝了全部的節點、連線、以及關口等信息。所以這個Process對象還是非常重要的,拿到這個對象就能夠為所欲為了。

這個BpmnModel對象能夠參考:http://blog.csdn.net/qq_30739519/article/details/51166993這篇文章。

1.1.4.?問題以及延伸

上面的代碼基本上已經滿足我們的需求,可是也存在2個問題:

第一個問題:獲取配置文件裏節點的配置信息,上文我們獲取到的是指定的任務節點的配置信息,怎麽獲取全部的節點配置信息呢?非常顯然我們能夠推斷這個FlowElement類型進行轉換到相應的類型獲取。這個比較簡單?FlowElement是一個抽象類。以下有非常多實現類。

相應推斷轉換就可以。

第二個問題:我們怎麽能一路究竟獲取到全部的配置節點信息。以及配置的路徑軌跡的信息呢?這裏提供的思路?例如以下:activiti是依據連線運轉的。我們能夠開始從開始節點查找出線。一直查到結束節點。能夠使用遞歸實現。

1.1.5.?遺留問題

可能有些讀者對於上面的Process不是非常熟悉,Process是動態部署中非經常常使用的一個對象。所以我們興許章節會專門出一個章節來解說Process對象中的各個子對象。以及子對象的特性。

activiti 配置節點 連線信息獲取