首页 > 代码库 > Liferay7 BPM门户开发之2: BPMN 2.0 开发入门 (Activiti BPMN extensions)

Liferay7 BPM门户开发之2: BPMN 2.0 开发入门 (Activiti BPMN extensions)

本文参考地址:http://activiti.org/userguide/index.html#bpmnConstructs

BPMN 2.0中的重要概念:

  • Events 事件 
  • Sequence Flow 顺序流
  • Gateways 网关
  • Tasks 任务
  • Sub-Processes and Call Activities 子流程
  • Transactions and Concurrency 事务并发
  • Process Initiation Authorization 初始化认证
  • Data objects 流程数据

其他相关项:

  • Form properties 表单属性
  • External form rendering 外部表单集成

1、Events

1、1 Timer Event Definitions

由时间触发的时间,用于

  • start event
  • intermediate event
  • boundary event

必须有确切的一个元素,分别是:

timeDate

<timerEventDefinition> <timeDate>2011-03-11T12:13:14</timeDate> </timerEventDefinition>

在确切的时间点执行

timeDuration

<timerEventDefinition> <timeDuration>P10D</timeDuration> </timerEventDefinition>

 

间隔10天执行

timeCycle

<timerEventDefinition>
  <timeCycle activiti:endDate="2015-02-25T16:42:11+00:00">R3/PT10H</timeCycle>
</timerEventDefinition>
或者变量形式:
<timerEventDefinition>
  <timeCycle>R3/PT10H/${EndDate}</timeCycle>
</timerEventDefinition>

循环3次,间隔10小时

也可以使用cron expressions :http://www.quartz-scheduler.org/documentation/

 

1.2 Signal Event Definitions

一个例子:https://github.com/chanjarster/activiti-learn/wiki/%E8%AF%A6%E8%A7%A3signal%20event

1.3 Message Event Definitions

想象一下,作为一个嵌入式的流程引擎(不是国内很多固化Hardcode式的流程引擎),Activiti关心的是实际从第三方应用系统接收的消息。这将是环境依赖和需要特定平台的活动。
比如:

  • 连接到JMS(java消息服务)队列
  • 处理一个WebService
  • REST请求
  • MQ队列的消息处理
  • XMPP消息监听
  • ......

总之,消息是和应用程序相关联的。

在您收到您的应用程序中的一个消息后,您必须决定该如何处理它。如果消息应该触发一个新的流程实例的开始,process instance的启动不应该使用runtimeService.startProcessInstanceByKey,在以下方法中选择:

  • ProcessInstance startProcessInstanceByMessage(String messageName);
  • ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
  • ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object> processVariables);
<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>

有不同的方式来启动事件,Message Event Definitions 就非常有用了

例如订单可能来自call center ,也可以来自web shop

技术分享

 

1.4 Start Events

开始事件总是捕捉型(Catching)的,比如一个消息接收,比如一个时间触发,总是有指定的触发。

<startEvent id="request" activiti:initiator="initiator" />

启动:

try {  identityService.setAuthenticatedUserId("bono");  runtimeService.startProcessInstanceByKey("request");} finally {  identityService.setAuthenticatedUserId(null);}

1.5 None Start Event

一个无启动事件在技术上意味着启动过程实例的触发器是未指定的。而且没有子元素节点。

一个有启动表单的例子:

<startEvent id="request" activiti:formKey="org/activiti/examples/taskforms/request.form" />

图形是一个空心圆:

技术分享

 

1.6 Timer Start Event

时间启动事件,是一个时钟在中间的圆:

技术分享

1.7 Boundary Events

边界事件是catching型的,连接到一个活动(一个边界事件永远不会throwing)的事件。
这意味着,当活动正在运行时,事件正在侦听某种类型的触发器。当事件被捕获时,该活动被中断,顺序流下行。

<boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport">  <timerEventDefinition>    <timeDuration>PT4H</timeDuration>  </timerEventDefinition></boundaryEvent>

技术分享

<boundaryEvent id="boundary" attachedToRef="task" cancelActivity="true">          <messageEventDefinition messageRef="newCustomerMessage"/></boundaryEvent>

 

2. Sequence Flow

2.1 Conditional sequence flow

带有UEL条件表达式的顺序流

<sequenceFlow id="flow" sourceRef="theStart" targetRef="theTask">  <conditionExpression xsi:type="tFormalExpression">    <![CDATA[${order.price > 100 && order.price < 250}]]>  </conditionExpression></sequenceFlow>

 

2.2 Default sequence flow

任务和网关都可以有默认顺序流。

技术分享

<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" default="flow2" /><sequenceFlow id="flow1" sourceRef="exclusiveGw" targetRef="task1">  <conditionExpression xsi:type="tFormalExpression">${conditionA}</conditionExpression></sequenceFlow><sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="task2"/><sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="task3">  <conditionExpression xsi:type="tFormalExpression">${conditionB}</conditionExpression></sequenceFlow>

flow2就是默认顺序流,当所有条件不满足,则选择默认顺序流。

 

3 Gateways

 

Liferay7 BPM门户开发之2: BPMN 2.0 开发入门 (Activiti BPMN extensions)