Liferay7 BPM门户开发之4: Activiti事件处理和监听Event handlers
事件机制从Activiti 5.15开始引入,这非常棒,他可以让你实现委托。
可以通过配置添加事件监听器,也可以通过Runtime API加入注册事件。
所有的事件参数子类型都来自org.activiti.engine.delegate.event.ActivitiEvent
包含的信息:
- type
- executionId
- processInstanceId
- processDefinitionId
事件监听
其中,JOB_EXECUTION_SUCCESS 和JOB_EXECUTION_FAILURE 是ActivitiEvent的 type 信息,即事件类型
public class MyEventListener implements ActivitiEventListener {
@Override
public void onEvent(ActivitiEvent event) {
switch (event.getType()) {
case JOB_EXECUTION_SUCCESS:
System.out.println("A job well done!");
break;
case JOB_EXECUTION_FAILURE:
System.out.println("A job has failed...");
break;
default:
System.out.println("Event received: " + event.getType());
}
}
@Override
public boolean isFailOnException() {
// The logic in the onEvent method of this listener is not critical, exceptions
// can be ignored if logging fails...
return false;
}
}
org.activiti.engine.delegate.event.BaseEntityEventListener
BaseEntityEventListener 是entity-events事件监听器的基类,不需要类型检查,可以用来监听一种特定类型的实体或所有实体相关的事件:
- onCreate(..)
- onUpdate(..)
- onDelete(..)
- onEntityEvent(..)
通过配置注册事件实例
配置方法:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
...
<property name="eventListeners">
<list>
<bean class="org.activiti.engine.example.MyEventListener" />
</list>
</property>
</bean>
属性eventListeners 用来设置org.activiti.engine.delegate.event.ActivitiEventListener 的实例,注意:它是列表,可以多个。
typedEventListeners 用来设置基于事件类型分发的ActivitiEventListener 的实例:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
...
<property name="typedEventListeners">
<map>
<entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
<list>
<bean class="org.activiti.engine.example.MyJobEventListener" />
</list>
</entry>
</map>
</property>
</bean>
通过Runtime API注册事件实例
方法是通过RuntimeService
void addEventListener(ActivitiEventListener listenerToAdd); void addEventListener(ActivitiEventListener listenerToAdd, ActivitiEventType... types); void removeEventListener(ActivitiEventListener listenerToRemove);
通过流程定义注册事件实例
可以将事件监听器添加到一个特定的流程定义中,侦听器只会被调用与流程定义相关的事件,用于抛出message/signal/error 到BPMN event
而processEngineConfiguration配置的方法是全局的。
下面的例子:
第一个监听器将接收任何类型的事件,基于一个完全限定的类名称(fully-qualified class name)的监听器实现。
第二个监听器只通知当一个作业成功执行或失败时,使用已被定义在进程引擎配置的bean属性中的监听器。
<process id="testEventListeners">
<extensionElements>
<activiti:eventListener class="org.activiti.engine.test.MyEventListener" />
<activiti:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" />
</extensionElements> ... </process>
BaseEntityEventListener 也可以注册:
entityType实体类型包含:
- attachment
- comment
- execution
- identity-link
- job
- process-instance
- process-definition
- task
<process id="testEventListeners">
<extensionElements>
<activiti:eventListener class="org.activiti.engine.test.MyEventListener" entityType="task" />
<activiti:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" />
</extensionElements> ... </process>
throwing BPMN events
<process id="testEventListeners">
<extensionElements>
<activiti:eventListener throwEvent="signal" signalName="My signal" events="TASK_ASSIGNED" />
</extensionElements>
</process> <process id="testEventListeners">
<extensionElements>
<activiti:eventListener throwEvent="globalSignal" signalName="My signal" events="TASK_ASSIGNED" />
</extensionElements>
</process> <process id="testEventListeners">
<extensionElements>
<activiti:eventListener throwEvent="message" messageName="My message" events="TASK_ASSIGNED" />
</extensionElements>
</process> <process id="testEventListeners">
<extensionElements>
<activiti:eventListener throwEvent="error" errorCode="123" events="TASK_ASSIGNED" />
</extensionElements>
</process>
只能通过RuntimeService 分发:
void dispatchEvent(ActivitiEvent event);
事件类型
事件名称 描述 事件类型
| ENGINE_CREATED | 监听器监听的流程引擎已经创建完毕,并准备好接受API调用。 | org.activiti...ActivitiEvent |
| ENGINE_CLOSED | 监听器监听的流程引擎已经关闭,不再接受API调用。 | org.activiti...ActivitiEvent |
| ENTITY_CREATED | 创建了一个新实体。实体包含在事件中。 | org.activiti...ActivitiEntityEvent |
| ENTITY_INITIALIZED | 创建了一个新实体,初始化也完成了。如果这个实体的创建会包含子实体的创建,这个事件会在子实体都创建/初始化完成后被触发,这是与 ENTITY_CREATED的区别。 |
org.activiti...ActivitiEntityEvent |
| ENTITY_UPDATED | 更新了已存在的实体。实体包含在事件中。 | org.activiti...ActivitiEntityEvent |
| ENTITY_DELETED | 删除了已存在的实体。实体包含在事件中。 | org.activiti...ActivitiEntityEvent |
| ENTITY_SUSPENDED | 暂停了已存在的实体。实体包含在事件中。会被ProcessDefinitions, ProcessInstances 和 Tasks抛出。 | org.activiti...ActivitiEntityEvent |
| ENTITY_ACTIVATED | 激活了已存在的实体,实体包含在事件中。会被ProcessDefinitions, ProcessInstances 和 Tasks抛出。 | org.activiti...ActivitiEntityEvent |
| JOB_EXECUTION_SUCCESS | 作业执行成功。job包含在事件中。 | org.activiti...ActivitiEntityEvent |
| JOB_EXECUTION_FAILURE | 作业执行失败。作业和异常信息包含在事件中。 | org.activiti...ActivitiEntityEvent and org.activiti...ActivitiExceptionEvent |
| JOB_RETRIES_DECREMENTED | 因为作业执行失败,导致重试次数减少。作业包含在事件中。 | org.activiti...ActivitiEntityEvent |
| TIMER_FIRED | 触发了定时器。job包含在事件中。 | org.activiti...ActivitiEntityEvent |
| JOB_CANCELED | 取消了一个作业。事件包含取消的作业。作业可以通过API调用取消, 任务完成后对应的边界定时器也会取消,在新流程定义发布时也会取消。 | org.activiti...ActivitiEntityEvent |
| ACTIVITY_STARTED | 一个节点开始执行 | org.activiti...ActivitiActivityEvent |
| ACTIVITY_COMPLETED | 一个节点成功结束 | org.activiti...ActivitiActivityEvent |
| ACTIVITY_SIGNALED | 一个节点收到了一个信号 | org.activiti...ActivitiSignalEvent |
| ACTIVITY_MESSAGE_RECEIVED | 一个节点收到了一个消息。在节点收到消息之前触发。收到后,会触发 ACTIVITY_SIGNAL或 ACTIVITY_STARTED,这会根据节点的类型(边界事件,事件子流程开始事件) |
org.activiti...ActivitiMessageEvent |
| ACTIVITY_ERROR_RECEIVED | 一个节点收到了一个错误事件。在节点实际处理错误之前触发。 事件的 activityId对应着处理错误的节点。 这个事件后续会是 ACTIVITY_SIGNALLED或 ACTIVITY_COMPLETE, 如果错误发送成功的话。 |
org.activiti...ActivitiErrorEvent |
| UNCAUGHT_BPMN_ERROR | 抛出了未捕获的BPMN错误。流程没有提供针对这个错误的处理器。 事件的 activityId为空。 |
org.activiti...ActivitiErrorEvent |
| ACTIVITY_COMPENSATE | 一个节点将要被补偿。事件包含了将要执行补偿的节点id。 | org.activiti...ActivitiActivityEvent |
| VARIABLE_CREATED | 创建了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 | org.activiti...ActivitiVariableEvent |
| VARIABLE_UPDATED | 更新了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 | org.activiti...ActivitiVariableEvent |
| VARIABLE_DELETED | 删除了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 | org.activiti...ActivitiVariableEvent |
| TASK_ASSIGNED | 任务被分配给了一个人员。事件包含任务。 | org.activiti...ActivitiEntityEvent |
| TASK_CREATED | 创建了新任务。它位于 ENTITY_CREATE事件之后。当任务是由流程创建时, 这个事件会在TaskListener执行之前被执行。 |
org.activiti...ActivitiEntityEvent |
| TASK_COMPLETED | 任务被完成了。它会在 ENTITY_DELETE事件之前触发。当任务是流程一部分时,事件会在流程继续运行之前, 后续事件将是 ACTIVITY_COMPLETE,对应着完成任务的节点。 |
org.activiti...ActivitiEntityEvent |
| TASK_TIMEOUT | 任务已超时,在 TIMER_FIRED事件之后,会触发用户任务的超时事件, 当这个任务分配了一个定时器的时候。 |
org.activiti...ActivitiEntityEvent |
| PROCESS_COMPLETED | 流程已结束。在最后一个节点的 ACTIVITY_COMPLETED事件之后触发。 当流程到达的状态,没有任何后续连线时, 流程就会结束。 |
org.activiti...ActivitiEntityEvent |
| MEMBERSHIP_CREATED | 用户被添加到一个组里。事件包含了用户和组的id。 | org.activiti...ActivitiMembershipEvent |
| MEMBERSHIP_DELETED | 用户被从一个组中删除。事件包含了用户和组的id。 | org.activiti...ActivitiMembershipEvent |
| MEMBERSHIPS_DELETED | 所有成员被从一个组中删除。在成员删除之前触发这个事件,所以他们都是可以访问的。 因为性能方面的考虑,不会为每个成员触发单独的 MEMBERSHIP_DELETED事件。 |
org.activiti...ActivitiMembershipEvent |
Liferay7 BPM门户开发之4: Activiti事件处理和监听Event handlers的更多相关文章
- Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)
注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...
- Liferay7 BPM门户开发之8: Activiti实用问题集合
1.如何实现审核的上级获取(任务逐级审批) 这个是必备功能,通过Spring的注入+Activiti表达式可以很容易解决. 可参考: http://blog.csdn.net/sunxing007/a ...
- Liferay7 BPM门户开发之7: Activiti中的重要概念和主要数据库结构
流程的人员参与角色: Assignee :签收者(即待办人) Candidate:候选人 Owner:拥有者 Starter:启动者 participant:参与者,包含查阅 流程变量的类型: Str ...
- Liferay7 BPM门户开发之6: Activiti数据库换为mysql
第一步: 在mysql中创建数据库名字叫 'activiti' 执行D:\activiti-5.21.0\database\create下的脚本 第二步: 打开=> apache-tomcat/ ...
- Liferay7 BPM门户开发之5: Activiti和Spring集成
参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...
- Liferay7 BPM门户开发之3: Activiti开发环境搭建
下载地址: http://activiti.org/download.html 源码: https://github.com/Activiti/Activiti 环境准备(检查项): JDK 1.7 ...
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...
- Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发
hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...
- Liferay7 BPM门户开发之17: Portlet 生命周期
Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...
随机推荐
- IntelliJ IDEA2017 激活方法 最新的(亲测可用)
IntelliJ IDEA2017 激活方法(亲测可用): 搭建自己的授权服务器,对大佬来说也很简单,我作为菜鸟就不说了,网上有教程. 我主要说第二种,现在,直接写入注册码,是不能成功激活的(如果你成 ...
- Codeforces Round #436 A. Fair Game
题意:给你n张卡片,上面写有数字,两个人选择两个数字,把相同数字的卡片都拿走,问能不能拿走所有的卡片并且两个人拿的卡片书相同. Examples Input 411272711 Output YES1 ...
- Lua中面向对象
一.Lua中类的简单实现: (1)版本——摘自 Cocos2.0中的: --Create an class. function class(classname, super) local superT ...
- cdnbest里站点域名不同步到节点,报400错误的一般原因
报400错误一般是站点里的域名没有同步到节点上面的原因,产生的原因一般是下面两点原因: 1.检查节点列表如下图所示的状态是否打钩,这是节点和主控的通信状态,打叉表示连接有问题 这里打叉的几种原因(1) ...
- Python: 下载底层由Python2转Python3环境更新手记
谨记录运行环境改变过程中所碰到的坑. 下载底层运行环境由Python2移至Python3所遇到的问题及处理方法: 1.所引的第三方组件,基本都有替代支持:msvcr90.dll不再需要,有则报错2.引 ...
- UI动画优化技巧
知乎上一篇比较好的文章,分享一下: tabs slide 内容过渡动画 好的动画会淡化页面直接的过度. 但更好的做法是使用连续的动画来来过度内容 当我们在设计交互式选项卡或弹出式菜单的时候,尝试将内容 ...
- Eigen矩阵基本运算
1 矩阵基本运算简介 Eigen重载了+,-,*运算符.同时提供了一些方法如dot(),cross()等.对于矩阵类的运算符重载只支持线性运算,比如matrix1*matrix2是矩阵相乘,当然必须要 ...
- Legend 图例
1.添加图例 >>> import matplotlib.pyplot as plt >>> import numpy as np >>> x = ...
- Zookeeper Client基础操作和Java调用
## Zookeeper > Zookeeper目前用来做数据同步,再各个服务之前同步关键信息 i.客户端操作 1. 创建 create [-s] [-e] path data acl -s 为 ...
- spring web参数传递
spring boot 参数相关 ****************************************** @RequestParam 这个注解用来绑定单个请求数据,既可以是url中的 ...