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 {@Overridepublic 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());}}@Overridepublic 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lm358在哪个库里_库里8和aj35哪个好 库里8是安德玛的吗

库里8代作为全新的实战篮球鞋&#xff0c;也是带有库里logo的首款鞋&#xff0c;还是很受大家关注的&#xff0c;不过就是价格的话可能相对偏高一些&#xff0c;不过总体的性能还是不错的&#xff0c;那么大家觉得库里8和aj35哪个实战性能好呢&#xff1f;下面就和天马商盟的小…

Windows快捷键大全

天气:心情:Windows快捷键大全 一、常见用法&#xff1a; F1 显示当前程序或者windows的帮助内容。 F2 当你选中一个文件的话&#xff0c;这意味着“重命名” F3 当你在桌面上的时候是打开“查找&#xff1a;所有文件” 对话框 F10或ALT 激活当前程序的菜单栏 windows键或CTRLES…

ajax设置自定义请求头信息

客户端请求 $.ajax({ type:"post", url:urlstr, dataType:json, async:true, headers:{token:abck}, success:function (data) { console.log(data.info); console.log(JSON.stringify(data)); }, error:function (xhr,text) { alert(text); } }); 服务端代码 public…

HTML元素参考手册 HTML Elements Reference

a表示超链接的起始或目的位置。acronym表示取首字母的缩写词。address表示特定信息&#xff0c;如地址、签名、作者、文档信息。applet在页面上放置可执行内容。area定义一个客户端图像映射中一个超级链接区域的形状、坐标和关联 URL。b指定文本应以粗体显示。base指定一个显式…

ei加声调怎么加_ei在e还是i上标声调

展开全部ei在e上标声调。汉语拼音的标调口诀是&#xff1a;1、a母出现62616964757a686964616fe58685e5aeb931333431353864不放过&#xff0c; (即韵母中凡是有a的&#xff0c;标在a上。如lao,标在a上)&#xff1b;2、没有a母找 o e &#xff0c; (没有a&#xff0c;但有o 或e的…

Quartz简单实例

Quartz中提供了两种触发器&#xff0c;分别是CronTrigger和SimpleTrigger。 1. SimpleTrigger 每隔若干毫秒来触发纳入进度的任务。 2. CronTrigger 在特定“格林日历”时刻触发纳入进程的任务。 调度程序如下&#xff1a; public class TestQuartz {public void myTask() thro…

HTML框架(Frames)

使用框架(Frame)&#xff0c;你可以在浏览器窗口同时显示多个网页。每个Frame里设定一个网页&#xff0c;每个Frame里的网页相互独立。 Frameset <frameset></frameset>决定如何划分Frame。<frameset>有cols属性和rows属性。使用cols属性&#xff0c;表示按列…

南邮哈夫曼编码c语言代码_漫画:“哈夫曼编码” 是什么鬼?

​在上一期&#xff0c;我们介绍了一种特殊的数据结构 “哈夫曼树”&#xff0c;也被称为最优二叉树。没看过的小伙伴可以点击下方链接&#xff1a;漫画&#xff1a;什么是 “哈夫曼树” &#xff1f;那么&#xff0c;这种数据结构究竟有什么用呢&#xff1f;我们今天就来揭晓答…

python安装lxml,在windows环境下

http://blog.csdn.net/g1apassz/article/details/46574963 文件下载&#xff1a;http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 找到对应的文件&#xff0c;例如&#xff1a;lxml-3.6.4-cp27-cp27m-win32.whl转载于:https://www.cnblogs.com/hooca/p/5952710.html

虚拟内存

虚拟内存用硬盘空间做内存来弥补计算机RAM空间的缺乏。当实际RAM满时&#xff08;实际上&#xff0c;在RAM满之前&#xff09; &#xff0c;虚拟内存就在硬盘上创建了。当物理内存用完后&#xff0c;虚拟内存管理器选择最近没有用过的&#xff0c;低优先级的 内存部分写到交换文…

查重多少合格_期刊论文查重一般多少合格?

sci遴选目标是收录相对较为重要的期刊&#xff0c;但世界上期刊太多太多&#xff0c;从中遴选出重要的期刊&#xff0c;会有筛选标准&#xff0c;即sci只会收录部分期刊。众多期刊中&#xff0c;谁能成为sci期刊&#xff0c;就要达到sci收录的标准&#xff0c;而标准少不了参考…

RegExp类型exec()方法的返回值说明

之前看别人写的插件经常会用到RegExp对象来验证输入&#xff0c;并且获取一些那时我并不晓得是什么东西的数组&#xff0c;来取值进行自定义的逻辑处理。今天学习了一下RegExp类型。终于有了一个初步的了解&#xff0c;至少不会看一会就感觉蒙圈了&#xff0c;记录分享一下 ECM…

记事本和textarea中的换行

换行符:chr(13)&chr(10) php替换$notestr_replace(chr(13).chr(10),"<br>",$note);

mysql-bin_MySQL - binlog日志简介及设置

基本概念binlog是Mysql sever层维护的一种二进制日志&#xff0c;与innodb引擎中的redo/undo log是完全不同的日志&#xff1b;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句&#xff0c;记录了所有的DDL和DML(除了数据查询语句)语句&#xff0c;并以事务的形式保存…

关于webservice(CXF)的一些理解

CXF是apache下开源的webservice框架&#xff0c;CXF依赖spring进行集成&#xff0c;支持soap1.1&#xff0c;soap1.2,XML/HTTP,RESTful HTTP 或者CORBA; 使用jaxws来实现 SOAP1.1,1.2; 1.通过编程的方法来实现CXF发布使用接口 &#xff1b; A. 使用了jaxwsSeverFactoryBean 这…