activiti笔记

来源:互联网 发布:mac装微软雅黑字体 编辑:程序博客网 时间:2024/06/16 06:48

activiti笔记

bpmn

bpmn 由BPMI(The Business Process Management Initiative)开发了一套标准叫业务流程建模符号(BPMN - Business Process Modeling Notation)。

在 BPMI Notation Working Group超过2年的努力,于2004年5月对外发布了BPMN 1.0 规范。后BPMI并入到OMG组织,OMG于2011年推出BPMN2.0标准

BPMN的主要目标是提供一些被所有业务用户容易理解的符号,从创建流程轮廓的业务分析到这些流程的实现,直到最终用户的管理监控。

bpmn常用有五大类元素 事件、顺序流、网关、任务、子流程

  1. 顺序流 是连接两个流程节点的连线。
    流程执行完一个节点后,会沿着节点的所有外出顺序流继续执行。
    图示:
    顺序流
    xml表示:
    <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />

  2. 网关 用来控制流程的流向的元素,常言来讲就是分叉口,根据功能不同可分为
    网关
    根据功能不同可以分为

    • 排他网关
    • 并行网关
    • 包含网关
    • 基于事件网关
  3. 任务
    这里写图片描述
    主要分为两大部分

    • 用户任务
      最常见的任务,可以进行任务的用户分配。assignee指定用户、candidateUsers指定候选人、candidateGroups指定候选组
      <userTask id="theTask" name="Important task" />
    • 自动任务
      当任务进行到这个节点时,自动完成一些任务
      如脚本任务、java服务任务、邮件任务等
  4. 子流程
    子流程(Sub-process)是一个包含其他节点,网关,事件等等的节点。 它自己就是一个流程,同时是更大流程的一部分。 子流程是完全定义在父流程里的 (这就是为什么叫做内嵌子流程)。
    <subProcess id="subProcess">
    <startEvent id="subProcessStart" />
    ... other Sub-Process elements ...
    <endEvent id="subProcessEnd" />
    </subProcess>

  5. 事件
    事件用来表明流程的生命周期中发生了什么事。 在BPMN 2.0中, 事件有两大分类:捕获(catching) 或 触发(throwing) 事件。
    捕获(Catching):当流程执行到事件, 它会等待被触发。触发的类型是由内部图表或XML中的类型声明来决定的。 捕获事件与触发事件在显示方面是根据内部图表是否被填充来区分的(白色的)。
    触发(Throwing):当流程执行到事件, 会触发一个事件。触发的类型是由内部图表或XML中的类型声明来决定的。 触发事件与捕获事件在显示方面是根据内部图表是否被填充来区分的(被填充为黑色)。
    最常见的为开始、结束事件
    <startEvent id="start" name="my start event" />
    <endEvent id="end" name="my end event" />

    主要分类有:

    • 定时器事件 定时器事件是根据指定的时间触发的事件。
      <timerEventDefinition>
      <timeDate>2011-03-11T12:13:14</timeDate>
      </timerEventDefinition>
    • 错误事件 错误事件是由指定错误触发的。
      <endEvent id="myErrorEndEvent">
      <errorEventDefinition errorRef="myError" />
      </endEvent>
    • 信号事件 信号事件会引用一个已命名的信号。信号全局范围的事件(广播语义)。 会发送给所有激活的处理器。

      <definitions... >
      <!-- declaration of the signal -->
      <signal id="alertSignal" name="alert" />
      <process id="catchSignal">
      <intermediateThrowEvent id="throwSignalEvent" name="Alert">
      <!-- signal event definition -->
      <signalEventDefinition signalRef="alertSignal" />
      </intermediateThrowEvent>
      ...
      <intermediateCatchEvent id="catchSignalEvent" name="On Alert">
      <!-- signal event definition -->
      <signalEventDefinition signalRef="alertSignal" />
      </intermediateCatchEvent>
      ...
      </process>
      </definitions>
    • 消息事件 消息事件会引用一个命名的消息。每个消息都有名称和内容。和信号不同, 消息事件总会直接发送个一个接受者。
      <definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
      xmlns:activiti="http://activiti.org/bpmn"
      targetNamespace="Examples"
      xmlns:tns="Examples">
      <message id="newInvoice" name="newInvoiceMessage" />
      <message id="payment" name="paymentMessage" />
      <process id="invoiceProcess">
      <startEvent id="messageStart" >
      <messageEventDefinition messageRef="newInvoice" />
      </startEvent>
      ...
      <intermediateCatchEvent id="paymentEvt" >
      <messageEventDefinition messageRef="payment" />
      </intermediateCatchEvent>
      ...
      </process>
      </definitions>

api

activiti的调用主要通过引擎api和各种服务。
类关系图:
这里写图片描述
java api:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();

发布流程:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml")
.deploy();

启动流程实例:
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employeeName", "Kermit");
variables.put("numberOfDays", new Integer(4));
variables.put("vacationMotivation", "I'm really tired!");
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);

完成任务:
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
for (Task task : tasks) {
Log.info("Task available: " + task.getName());
}

当然还有更多的查询,如任务查询:
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("kermit")
.processVariableValueEquals("orderId", "0815")
.orderByDueDate().asc()
.list();

用户权限

activiti使用identityService来管理流程用户
如newUser(String userId)创建用户
newGroup(String groupId)创建组
setUserPicture(String userId, Picture picture)设置用户图片
createGroupQuery()创建组查询
createUserQuery()创建用户查询

流程的启动,用户任务等等都可以设置去执行者,候选人,候选组等。
<process id="potentialStarter" activiti:candidateStarterUsers="user1, user2"
activiti:candidateStarterGroups="group1">
<userTask id="theTask" name="my task" activiti:assignee="kermit" />

可以通过各sevice的query方法查询用户的工作流、待完成任务等等等等

历史

在API中, 提供了对这5种实体的查询方法。类HistoryService 提供了以下几种方法

  • createHistoricProcessInstanceQuery()
    获取流程定义ID是’XXX’、已经结束、花费时间最长(持续时间最长)的10个HistoricProcessInstances
    historyService.createHistoricProcessInstanceQuery().finished() .processDefinitionId("XXX").orderByProcessInstanceDuration().desc() .listPage(0, 10);
  • createHistoricVariableInstanceQuery()
    在ID为’xxx’、已经结束的流程实例中查询所有HistoricVariableInstances,并按变量名排序
    historyService.createHistoricVariableInstanceQuery()
    .processInstanceId("XXX")
    .orderByVariableName.desc()
    .list();
  • createHistoricActivityInstanceQuery()
    获取所有已经结束的流程定义ID为’XXX’并且类型是’serviceTask’中的最后一个 HistoricActivityInstance
    historyService.createHistoricActivityInstanceQuery()
    .activityType("serviceTask")
    .processDefinitionId("XXX")
    .finished()
    .orderByHistoricActivityInstanceEndTime().desc()
    .listPage(0, 1);
  • createHistoricDetailQuery()
    获取所有id为123的流程实例中产量的可变更新信息。这个查询只会返回 HistoricVariableUpdates. 注意一些变量名可能包含多个 HistoricVariableUpdate 实体, 每次流程运行时会更新变量。 你可以用 orderByTime (变量被更新的时间) 或者 orderByVariableRevision (运行更新时变量的版本)来排序查询.
    historyService.createHistoricDetailQuery()
    .variableUpdates()
    .processInstanceId("123")
    .orderByVariableName().asc()
    .list()
  • createHistoricTaskInstanceQuery()
    获取所有任务中10个花费时间最长(持续时间最长)并已经结束的 HistoricTaskInstances 。
    historyService.createHistoricTaskInstanceQuery()
    .finished()
    .orderByHistoricTaskInstanceDuration().desc()
    .listPage(0, 10);

spring集成

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd                           http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  <!--数据源-->  <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">    <property name="driverClass" value="org.h2.Driver" />    <property name="url" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />    <property name="username" value="sa" />    <property name="password" value="" />  </bean>  <!--事物-->  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="dataSource" />  </bean>  <!--activit配置-->  <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">    <property name="dataSource" ref="dataSource" />    <property name="transactionManager" ref="transactionManager" />    <property name="databaseSchemaUpdate" value="true" />    <property name="jobExecutorActivate" value="false" />  </bean>  <!--activiti执行引擎-->  <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">    <property name="processEngineConfiguration" ref="processEngineConfiguration" />  </bean>  <!--activiti各种service-->  <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />  <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />  <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

数据库表结构

Activiti使用到的表都是ACT_开头的。

ACT_RE_*:

’RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。

ACT_RU_*:

‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

ACT_ID_*:

’ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。

ACT_HI_*:

’HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等

ACT_GE_*:

全局通用数据及设置(general),各种情况都使用的数据。

1 act_ge_bytearray 二进制数据表
2 act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
3 act_hi_actinst 历史节点表
4 act_hi_attachment 历史附件表
5 act_hi_comment 历史意见表
6 act_hi_identitylink 历史流程人员表
7 act_hi_detail 历史详情表,提供历史变量的查询
8 act_hi_procinst 历史流程实例表
9 act_hi_taskinst 历史任务实例表
10 act_hi_varinst 历史变量表
11 act_id_group 用户组信息表
12 act_id_info 用户扩展信息表
13 act_id_membership 用户与用户组对应信息表
14 act_id_user 用户信息表
15 act_re_deployment 部署信息表
16 act_re_model 流程设计模型部署表
17 act_re_procdef 流程定义数据表
18 act_ru_event_subscr throwEvent、catchEvent时间监听信息表
19 act_ru_execution 运行时流程执行实例表
20 act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
21 act_ru_job 运行时定时任务数据表
22 act_ru_task 运行时任务节点表
23 act_ru_variable 运行时流程变量数据表

test

0 0
原创粉丝点击