1.1.1. 前言

当使用eclipse插件进行流程设计的时候,部署流程之后,我们如何获取我们定义的所有的节点、连线、关口等配置信息呢?有的人看到这个需求,不免窃喜,这不很简单嘛,重新打来bmpn中定义的xml信息,查看不就完了,确实这种方式是可取的,但是当我们的项目流程在启动的时候,我们想要获取定义的信息的时候,换言之就是 我们能动态的读取里面的信息反馈给系统用户的时候,我们该如何获取呢?总不能告诉用户你去打开xml文件自己去查看,用户未必能看懂里面的xml定义信息吧。这种方式不是增加了用户操作难度,还要找个人培训用户吧。那所以我们该如何提供一个接口,让用户需要看的时候,点击一个按钮,就能一目了然的看到配置的信息呢,这是其一,第二:我们如何可以获取到一个任务的出线信息,动态的渲染到页面,让用户操作呢?举一个简单的例子,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. 问题以及延伸

个问题:

第一个问题:获取配置文件中节点的配置信息,上文我们获取到的是指定的任务节点的配置信息,怎么获取所有的节点配置信息呢?很显然我们可以判断这个FlowElement类型进行转换到对应的类型获取,这个比较简单 FlowElement是一个抽象类,下面有很多实现类。对应判断转换即可。

第二个问题:我们怎么能一路到底获取到所有的配置节点信息,以及配置的路径轨迹的信息呢?这里提供的思路 如下:activiti是根据连线运转的。我们可以开始从开始节点查找出线,一直查到结束节点。可以使用递归实现。

1.1.5. 遗留问题

可能有些读者对于上面的Process不是很熟悉,Process是动态部署中非常常用的一个对象,所以我们后续章节会专门出一个章节来讲解Process对象中的各个子对象,以及子对象的特性。

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

  1. activiti流程图上获取各节点的信息获取

    背景:         由于项目的需要,当用户在查看流程图时,当点击某个流程图片上的节点时,需要提示一些信息,这就需要获取各个节点的信息,此处获取id和name的值.           注意:这个并 ...

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

    <?xml version="1.0" encoding="UTF-8"?> <!--课程封面信息 --> <GK version ...

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

    前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文 ...

  4. Activiti配置实例以及Spring集成配置

    public class TestDB { public static void main(String[] args) { //1. 创建Activiti配置对象的实例 ProcessEngineC ...

  5. asp.net中web.config配置节点大全详解

    最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...

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

    一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是 ...

  7. activiti 任务节点 处理人设置【转】

    转自http://blog.csdn.net/qq_30739519/article/details/51225067 1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自 ...

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

    一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是 ...

  9. activiti 任务节点 处理人设置

    1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 我们在使用activiti 工作流引擎的时候, ...

随机推荐

  1. java开发----自定义对象,重写equals方法

    javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...

  2. Junit简单配置

    Junit简单配置的步骤如下: 1.在WEB-INF目录下的lib里面放一个junit包,我用的是junit-4.9.jar: 2.选定要测试的类,右键单击该类,新建一个Junit Test Case ...

  3. [Cqoi2010]扑克牌

    Description 你有n种牌,第i种牌的数目为ci.另外有一种特殊的 牌:joker,它的数目是m.你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1 ...

  4. [POJ1741]树上的点对 树分治

    Description 给一棵有n个节点的树,每条边都有一个长度(小于1001的正整数). 定义dist(u,v)=节点u到节点v的最短路距离. 给出一个整数k,我们称顶点对(u,v)是合法的当且仅当 ...

  5. VK Cup 2017 - Round 1

    和FallDream组队瞎打一通--B两个人写的都挂了233,最后只剩下FallDream写的A和我写的C,最后我yy了个E靠谱做法结果打挂了,结束之后改了改就A了,难受. AC:AC Rank:18 ...

  6. Python中tuple的功能介绍

    Tuple的功能介绍 1. 元祖的两种方法 1. 元祖的内置方法 两个元祖的相加 格式:x.__add__(y)等同于x+y 例如:tu1 = (1,2,3,) print(tu1.__add__(( ...

  7. 第五次C语言作业

    (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...

  8. JButton

    JButton和Button区别: Button是在java.awt.*中的,而JButton是在javax.swing.*中,swing是awt的一个扩展,由纯java便携,它有一个与平台无关的实现 ...

  9. 解决scroll在ios上卡顿问题和兼容ios不支持:active伪类情况

    //有时候因为滚动层级元素过多会产生卡顿,特别在ios上十分明显,如果不想更换其他实现方式,可以加:-webkit-overflow-scrolling: touch; 开启硬件加速: 兼容ios不支 ...

  10. 创建OpenGL Context(WGL)

    创建OpenGL Context(WGL) 创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL cont ...