1.事件及监听器原理

当流程引擎启动的时候,我们定义的监听器,就已经注册在一个事件类型上面。

注册的方式有多种,它可以注册在所有的事件类型上面、也可以注册在指定的几个事件类型上面,这样引擎启动的时候就已经完成了监听器与事件的注册。

那么在流程运行的过程中,会有这样一个环节:

首先我们有一个事件源与一个事件类型的关系,比如说,我创建一个流程引擎,这个事件源就是流程引擎对象。类型就是 把它创建了。也就是说流程引擎创建过程,

触发出我们的事件,这个事件对象,也就是流程引擎被创建。当这个事件被分发出来的时候,或者发布出来的时候,也就会被监听器监听这个事件。

当然,我们可以在一个事件上注册多个监听器,当事件发生的时候,监听器会一次执行自己的方法,这样就可以让一个事件在发生变化的时候,监听器直接或者间接的感受到它的变化。

综上,这个过程中,我们需要:

首先有一个事件对象

在这个事件对象上绑定或注册监听器和事件类型

监听器会触发的方法。

监听器配置方式:

Activiti的事件监听(与监听原理图相对应):

Activiti的事件监听:

在实现监听器的过程中,大多监听器都会对事件类型做一个判断。监听器只去判断几个事件类型,类型不符的直接忽略。

(ps:事件类型里还支持自定义类型。)

创建一个监听器ProcessEventListener:

public class ProcessEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ProcessEventListener.class); //简单的完成一下监听器的效果
@Override
public void onEvent(ActivitiEvent event) {
ActivitiEventType eventType = event.getType();
if (ActivitiEventType.PROCESS_STARTED.equals(eventType)){
LOGGER.info("流程启动 {} \t {}",eventType,event.getProcessInstanceId());
}else if (ActivitiEventType.PROCESS_COMPLETED.equals(eventType)){
LOGGER.info("流程结束 {} \t {}",eventType,event.getProcessInstanceId());
}
} @Override
public boolean isFailOnException() {
return false;
}
}

注册监听配置文件:

activiti_eventListener.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> <bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<!-- 给引擎设置自定义的commandInvoker -->
<!--<property name="commandInvoker" ref="commandInvoker" />-->
<property name="eventListeners">
<list>
<!-- 配置上监听器 -->
<bean class="com.yy.avtiviti.helloworld.event.ProcessEventListener"/>
</list>
</property>
</bean>
<bean id="commandInvoker" class="com.yy.avtiviti.helloworld.intercept.MDCCommandInvoker"/> </beans>

测试类:

public class configEventListenerTest {
private static final Logger LOGGER = LoggerFactory.getLogger(configTest.class); @Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti_eventListener.cfg.xml");//传入自定义的mdc配置文件 @Test
@Deployment(resources = {"my-process.bpmn20.xml"})//流程定义文件
public void test() {
ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
activitiRule.getTaskService().complete(task.getId());
//想遍历EventLog数据,需要用到新的service(ManagementService) //状态流转
LOGGER.info("-----------状态流转----------");
List<EventLogEntry> eventLogEntries = activitiRule
.getManagementService()
.getEventLogEntriesByProcessInstanceId(
processInstance.getProcessDefinitionId());
for (EventLogEntry eventLogEntry : eventLogEntries) {
LOGGER.info("eventLog.type = {},eventLog.data = {}",eventLogEntry.getType(),new String(eventLogEntry.getData()));
}
LOGGER.info("eventLogEntries = {}",eventLogEntries.size());
}

测试结果如下:


第二种注册监听的配置方法,只用改配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> <bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<!-- 给引擎设置自定义的commandInvoker -->
<!--<property name="commandInvoker" ref="commandInvoker" />-->
<!--<property name="eventListeners">
<list>
&lt;!&ndash; 配置上监听器 &ndash;&gt;
<bean class="com.yy.avtiviti.helloworld.event.ProcessEventListener"/>
</list>
</property>-->
<property name="typedEventListeners">
<map>
<!-- 只监听流程启动这个事件 -->
<entry key="PROCESS_STARTED">
<list>
<bean class="com.yy.avtiviti.helloworld.event.ProcessEventListener"/>
</list>
</entry>
</map>
</property>
</bean>
<bean id="commandInvoker" class="com.yy.avtiviti.helloworld.intercept.MDCCommandInvoker"/> </beans>

测试结果如下图,与预期相符,只监听了流程的启动。

Activiti6事件及监听器配置(学习笔记)的更多相关文章

  1. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

  2. redis 安装配置学习笔记

    redis 安装配置学习笔记 //wget http://download.redis.io/releases/redis-2.8.17.tar.gz 下载最新版本 wget http://downl ...

  3. Activiti6作业执行器Job Executor配置(学习笔记)

    内容概况: 异步执行配置相关: asyncExecutorActivate:这个属性是激活作业执行器,它的默认参数是false,只有设为true,activiti启动的时候才会开启线程池去扫描定时操作 ...

  4. Elasticsearch的配置学习笔记

    文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器.它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的. ...

  5. cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)

    触摸事件 Sprite* sp1 = Sprite::create("Images/t1.png"); sp1->setPosition(Vec2(visibleSize.w ...

  6. Windows+Nginx+Tomcat整合的安装与配置学习笔记

    以下全部是nginx在window7下运行的: nginx学习总结: 我的是放在F盘 1.启动:F:\nginx-1.10.2\nginx-1.10.2>start nginx.exe(找到相应 ...

  7. Hive0.11安装配置学习笔记

    转:http://springsfeng.iteye.com/blog/1734517 1 . 首先请安装好MySQL并修改root账户密码,使用root账户执行下面命令:  su - root    ...

  8. php的具体配置学习笔记

    1.将php配置为apache的一个模块,使用loadmodule指令完成. 2.写下面的语句,此外需强调的是,每次配置都需要重新启动apache 3.php文件,要指定将其php模块来处理 4.PH ...

  9. linux配置学习笔记(一):如何提高ssh连接的速度

    服务器端sshd配置文件 /etc/ssh/sshd_config 看是否有如下的两条配置条目 GSSAPIAuthentication no UseDNS no 如果前面带#,请把#删掉,或者新添加 ...

随机推荐

  1. (1)Maven快速入门_1maven安装

    Maven 快速入门 1.1 Maven官网下载     windows 系统 下载 下图红色框选处. 下载到本地解压, 创建一个本地maven仓库的目录 maven_lib 配置Maven的环境变量 ...

  2. js 向上和向下取整

    Math.ceil(x),Math.floor(x) ◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数:◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近 ...

  3. CSS常见的中属性级,选择符级的Hack

    注意:尽量找到通用方法而减少对CSS Hack的使用,大规模使用CSS Hack会带来维护成本的提高以及浏览器版本变化而带来类似Hack失效等系列问题. 星号 * 针对IE6,7:下划线 _ 针对ie ...

  4. 查看系统cpu性能top和多核cpu使用性能

    1.使用top查看系统当前负载情况. 在显示过程 按P会按照cpu使用率排序,按M会按照内存占用率排序. 2.多核CPU上,每个核的使用率,使用 mpstat mpstat -P ALL 1 10 - ...

  5. Android 轮播图Banner切换图片的效果

    Android XBanner使用详解 2018年03月14日 08:19:59 AND_Devil 阅读数:910   版权声明:本文为博主原创文章,未经博主允许不得转载. https://www. ...

  6. mssql sqlserver 表增加列后,视图不会自动更新相关列的两种解决方法分享

    摘要: 今天对物理数据表,进行增加列操作后,程序一直显示无法找到相应列,通过仔细比对发现,视图中无相应列更新,下文将具体的解决方法分享如下: 例: create view vw_test as sel ...

  7. Unity2018 Open C# Project Error

    错误日志 升级到Unity2018之后,使用 Open C# Project 打开VS工程,出现报错,无法启动VS. 错误日志如下: ArgumentException: Value does not ...

  8. LVS负载均衡基础介绍及NET、DR模式配置

    LVS:术语: CIP:Client IP:客户端IP: VIP:Virtual Server IP:虚拟主机对外IP: RIP:Real Server IP:真实主机IP: DIP:Director ...

  9. docker容器日志收集方案(方案四,目前使用的方案)

    先看数据流图,然后一一给大家解释 ​ 这个方案是将日志直接从应用代码中将日志输出到redis中(注意,是应用直接连接redis进行日志输出),redis充当一个缓存中间件有一定的缓存能力,不过有限,因 ...

  10. OpenGL实例:三角形

    OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...