博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Liferay7 BPM门户开发之2: BPMN 2.0 规范入门 (Activiti BPMN extensions)
阅读量:4603 次
发布时间:2019-06-09

本文共 6692 字,大约阅读时间需要 22 分钟。

Liferay最大的问题是BPM弱,如果做企业开发,BPM必不可少,所以直入主题,做个BPMN2入门.

本文参考地址: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);
...
...

有不同的方式来启动事件,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)的事件。

这意味着,当活动正在运行时,事件正在侦听某种类型的触发器。当事件被捕获时,该活动被中断,顺序流下行。

PT4H

 

2. Sequence Flow

2.1 Conditional sequence flow

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

100 && order.price < 250}]]>

 

2.2 Default sequence flow

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

${conditionA}
${conditionB}

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

 

3 Gateways

 3.1 Exclusive Gateway

异或网关

     输入:只要有一个活动节点到达该网关那么就触发

     输出:有多个输出点时,只会触发一个

${input == 1}
${input == 2}
${input == 3}

3.2 Parallel Gateway

并行网关,可以有多个输入和输出(fork, join or both) ,实现AND逻辑

输入:该网关所有的输入节点都必须完成后才能触发该网关

输出:该网关的所有输出接点都将触发(除非转移条件不通过)

 

 3.3 Inclusive Gateway

Inclusive包容网关(Xor输入,And输出)

     输入:只要有一个活动节点到达该网关那么就触发该网关(同XOR输入)

     输出:该网关的所有输出接点都将触发(除非转移条件不通过)同AND输出

 

${paymentReceived == false}
${shipOrder == true}

 

4. TASKS

 

 4.1 User Task

需要用户参与的任务

humanPerformer 方式,指定一个执行人

kermit
potentialOwner 多个人或组
user(kermit), group(management)

还有通过属性来设置

  • <userTask id="theTask" name="my task" activiti:assignee="kermit" />
  • <userTask id="theTask" name="my task" activiti:candidateUsers="kermit, gonzo" />
  • <userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />

4.2 Script Task

4.3 Java Service Task

4.4 Business Rule Task

业务逻辑任务,使用 规则引擎来处理输入输出;

4.5 Camel Task

camel.apache 规则引擎任务,一个例子

 
org.activiti.camel.examples.pingPong.SaveOutput类
@Overridepublic void configure() throws Exception {  from("activiti:PingPongProcess:ping").transform().simple("${property.input} World");} 测试代码:
@Deploymentpublic void testPingPong() {  Map
variables = new HashMap
(); variables.put("input", "Hello"); Map
outputMap = new HashMap
(); variables.put("outputMap", outputMap); runtimeService.startProcessInstanceByKey("PingPongProcess", variables); assertEquals(1, outputMap.size()); assertNotNull(outputMap.get("outputValue")); assertEquals("Hello World", outputMap.get("outputValue"));}
 

 

 

 

 

5. Sub-Processes and Call Activities 子流程

 子流程是嵌入式的,不可重用,必须从None Start Event开始

而Call Activities本身调用的就是完整的流程

 

7. Process Initiation Authorization 初始化认证

 

group2, group(group3), user(user3)
...或
...

 

8. Data objects 流程数据

 

Testing123
...

 

9. Form properties 表单属性

  • StartFormData FormService.getStartFormData(String processDefinitionId)
  • TaskFormdata FormService.getTaskFormData(String taskId)

表单属性 room 对应--〉 流程变量 room 类型: String

表单属性 duration 对应--〉 流程变量 duration 类型: java.lang.Long
表单属性 speaker 对应--〉 流程变量 SpeakerName. 它是TaskFormData对象.
表单属性 street 对应--〉 Java bean 属性 street定义在流程变量 address

 

表单:

10. External form rendering 外部表单集成

 提交表单属性,第三方表单系统发送数据:

ProcessInstance FormService.submitStartFormData(String processDefinitionId, Map
properties) FormService.submitTaskFormData(String taskId, Map
properties)

获得属性,Acticiti接收处理数据:

  • StartFormData FormService.getStartFormData(String processDefinitionId) 
  • TaskFormdata FormService.getTaskFormData(String taskId).

转载于:https://www.cnblogs.com/starcrm/p/5942811.html

你可能感兴趣的文章
php 钩子函数原理 解析
查看>>
Windows Store App 全球化:在后台代码中引用字符串资源
查看>>
Sass 与SCSS
查看>>
Java中 ThreadPoolExecutor 类学习笔记
查看>>
Python_基于Python同Linux进行交互式操作实现通过堡垒机访问目标机
查看>>
Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控
查看>>
字典问题
查看>>
webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整【转】
查看>>
ArrayBlockingQuque摘要
查看>>
WiFi密码忘记了怎么办之解决方案
查看>>
ubuntu16.04设置tomcat自启动
查看>>
RabbitMQ 发布/订阅
查看>>
python subplot 合并子图的方法
查看>>
ZJOI 2017 线段树
查看>>
.net调用存储过程详解(转载)
查看>>
perl ExtUtils::Manifest
查看>>
交换机级联,堆叠,集群技术介绍
查看>>
PHOG特征
查看>>
[Leetcode 38] 125 Valid Palindrome
查看>>
灰度图像--图像增强 平滑之均值滤波、高斯滤波
查看>>