activiti 配置节点 连线信息获取

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对象中的各个子对象。以及子对象的特性。

原文地址:https://www.cnblogs.com/llguanli/p/8325293.html

时间: 2024-10-07 19:53:29

activiti 配置节点 连线信息获取的相关文章

c# 获取根节点的属性信息

<?xml version="1.0" encoding="UTF-8"?> <!--课程封面信息 --> <GK version="文"> <A/> </GK> 上面的XML中,GK是根节点,我们要获取version属性的值,利用Linq怎么写呢 ? 1 2 XElement xGK = XElement.Load("GK.xml");  string vsVers

App.config和Web.config配置文件的自定义配置节点

前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文件中的配置貌似出现了问题.查找节点发现是如下节点: <configSections> <section name="Test1" type="Demo.Section1,Demo"/> .............. </configSect

配置文件入门 - WebConfig.config常用配置节点介绍

一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是web.config. 一个.config配置文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config文件并不编译进dll文件中.将来如果客户端发生了变化,仅仅需要使用记事本打开Web.config文本编辑相关的设置就可以重新正常使用,而无

asp.net中web.config配置节点大全详解【转】

web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名,则查找它的上级目录,直到网站的根目录. (3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%"Microsoft.NET"Framework"v2.0.

activiti 任务节点 处理人设置

1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 我们在使用activiti 工作流引擎的时候,最常用的肯定是任务节点,因为在OA系统.审批系统.办公自动化系统中核心的处理就是流程的运转,流程的运转依赖于人员如何设置,人员的设置是非常重要的一个环节,所以说如果能让activiti 工作流引擎运转的核心,就必须要支持强大的人员组织架构设计.下面我们先说一下activiti 工作流引擎自身支持的可

创建自定义配置节点(web.config和app.config都适用)

无论是web程序.windows程序.windows service程序,配置文件都是少不了的.我们都习惯了将连接字符串放在ConnectionString节点中,将程序的设置放在appSetting节点中.配置文件的管理程序为我们提供了方便的管理方式,那么,我们如何自定义配置节点呢? 有两种方法,其一,继承IConfigurationSectionHandler,通过实现Create方法.这种方法的灵活度非常大,我们需要动手解析自定义节点的XmlNode,所以,实现起来也比较复杂.其二,继承C

.net学习笔记----WebConfig.config常用配置节点介绍

一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是web.config. 一个.config配置文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config文件并不编译进dll文件中.将来如果客户端发生了变化,仅仅需要使用记事本打开Web.config文本编辑相关的设置就可以重新正常使用,而无

.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个潜规则: 在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中. 因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性. 为了避免这个问题,.net的配置文件只是用属性存储而不使用inner

linux的帮助信息获取以及man章节的划分

linux的帮助信息获取以及man章节的划分 linux 帮助 man 章节 linux 获取帮助的途径 (1)help (2)man (3)info command在线获取 (4)程序自带帮助文档 (5)主流发行版的官方文档 (6)程序的官方文档 (7)搜索引擎(8)参考书籍 **** (1)help 内部命令 ~]#help Command 外部命令 命令自带简要格式的使用帮助 ~]#Command --help (2)man man的位置:/usr man帮助说明: NAME: 功能性说明