3. 配置
3.1. 创建一个ProcessEngine
Activiti流程引擎是通过名为activiti.cfg.xml的XML文件配置的。 请注意,如果您使用构建流程引擎的Spring样式,则这不适用。
获取ProcessEngine的最简单方法是使用org.activiti.engine.ProcessEngines
类:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
这将在类路径中查找activiti.cfg.xml文件,并根据该文件中的配置构建引擎。 以下片段显示了一个示例配置。 以下部分将详细介绍配置属性。
<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.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<property name="databaseSchemaUpdate" value="true" />
<property name="asyncExecutorActivate" value="false" />
<property name="mailServerHost" value="mail.my-corp.com" />
<property name="mailServerPort" value="5025" />
</bean>
</beans>
请注意,配置XML实际上是一个Spring配置。这并不意味着Activiti只能在Spring环境中使用!我们只是利用Spring内部的解析和依赖注入功能来构造引擎。
ProcessEngineConfiguration对象也可以使用配置文件以编程方式创建。 也可以使用不同的bean id(例如见第3行)。
ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
也可以不使用配置文件,并根据默认值创建配置(有关更多信息,请参阅不同的受支持的类)。
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
所有这些ProcessEngineConfiguration.createXXX()
方法都返回一个ProcessEngineConfiguration
,如果需要可以进一步调整。 在调用buildProcessEngine()
操作之后,将创建一个ProcessEngine:
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.setAsyncExecutorActivate(false)
.buildProcessEngine();
3.2. ProcessEngineConfiguration bean
activiti.cfg.xml必须包含一个ID为'processEngineConfiguration
'的bean。
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
这个bean然后用来构造ProcessEngine
。 有多个类可用于定义processEngineConfiguration
。 这些类表示不同的环境,并相应地设置默认值。 最好的做法是选择最适合您的环境的类,以尽量减少配置引擎所需的属性数量。 目前有以下课程可用(更多将在未来版本中发布):
- org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:流程引擎以独立的方式使用。 Activiti将负责交易。 默认情况下,只有在引擎启动时才会检查数据库(如果没有Activiti模式或模式版本不正确,则会抛出异常)。
- org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:这是用于单元测试的便利类。 Activiti将负责交易。 H2内存数据库是默认使用的。 数据库将在引擎启动并关闭时创建并删除。 使用这个时,可能不需要额外的配置(例如使用作业执行程序或邮件功能时除外)。
- org.activiti.spring.SpringProcessEngineConfiguration:在Spring环境中使用流程引擎时使用。 有关更多信息,请参阅Spring集成部分。
- org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:在引擎以独立模式运行时使用JTA事务。
3.3. 数据库配置
有两种方式来配置Activiti引擎将使用的数据库。 第一个选项是定义数据库的JDBC属性:
jdbcUrl: JDBC URL of the database.
jdbcDriver: implementation of the driver for the specific database type.
jdbcUsername: username to connect to the database.
jdbcPassword: password to connect to the database.
基于提供的JDBC属性构建的数据源将具有默认的MyBatis连接池设置。 可以选择设置以下属性来调整连接池(取自MyBatis文档):
jdbcMaxActiveConnections: 连接池在任何时间最多可以包含的活动连接数。 缺省值是10。
jdbcMaxIdleConnections: 连接池在任何时间最多可以包含的空闲连接数。
jdbcMaxCheckoutTime: 在强制返回连接之前,可以从连接池中检查连接的时间量(以毫秒为单位)。 默认是20000(20秒)。
jdbcMaxWaitTime: 这是一个低级别的设置,使池有机会打印日志状态,并重新尝试获取连接,以防异常耗时(避免在池被错误配置的情况下永远失败)默认为20000 (20秒)。
示例数据库配置:
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
我们的基准测试表明,在处理大量的并发请求时,MyBatis连接池并不是最高效或弹性的。 因此,建议我们使用javax.sql.DataSource实现,并将其注入到流程引擎配置(例如DBCP,C3P0,Hikari,Tomcat连接池等)中:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti" />
<property name="username" value="activiti" />
<property name="password" value="activiti" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
...
请注意,Activiti不附带允许定义这样的数据源的库。 所以你必须确保库在你的类路径上。
无论您使用JDBC还是数据源方法,都可以设置以下属性:
databaseType : 通常不需要指定该属性,因为它是从数据库连接元数据中自动分析的。 只能在自动检测失败的情况下指定。 可能的值:{h2,mysql,oracle,postgres,mssql,db2}。 此设置将决定使用哪些创建/删除脚本和查询。 请参阅支持的数据库部分,了解支持的类型。
databaseSchemaUpdate : 允许设置策略来处理流程引擎启动和关闭时的数据库模式。
false:
(默认值):在创建流程引擎时检查数据库模式的版本,并在版本不匹配时引发异常。true:
在构建流程引擎时,将执行检查,并在必要时执行模式的更新。如果架构不存在,则会创建该架构。create-drop:
创建流程引擎时创建模式,并在流程引擎关闭时删除模式。
3.4. JNDI 数据源配置
默认情况下,Activiti的数据库配置包含在每个Web应用程序的WEB-INF / classes的db.properties文件中。 这并不总是理想的,因为它要求用户修改Activiti源文件中的db.properties并重新编译war文件,或者在每个部署中分解war和修改db.properties。
通过使用JNDI(Java命名和目录接口)来获取数据库连接,连接由Servlet容器完全管理,配置可以在战争部署之外进行管理。 这也允许更多的控制连接参数比db.properties文件提供的更多。
3.4.1. 配置
JNDI数据源的配置将根据您正在使用的servlet容器应用程序而有所不同。 以下说明适用于Tomcat,但对于其他容器应用程序,请参阅容器应用程序的文档。
如果使用Tomcat,则在$CATALINA_BASE/conf/[enginename]/[hostname]/[warname] .xml
中配置JNDI资源(对于Activiti UI,通常为$ CATALINA_BASE/conf/Catalina/localhost/activiti-app
。XML)。 首次部署应用程序时,Activiti war文件将复制默认上下文,所以如果它已经存在,则需要替换它。 要更改JNDI资源,以便应用程序连接到MySQL而不是H2,例如,将文件更改为以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/activiti-app">
<Resource auth="Container"
name="jdbc/activitiDB"
type="javax.sql.DataSource"
description="JDBC DataSource"
url="jdbc:mysql://localhost:3306/activiti"
driverClassName="com.mysql.jdbc.Driver"
username="sa"
password=""
defaultAutoCommit="false"
initialSize="5"
maxWait="5000"
maxActive="120"
maxIdle="5"/>
</Context>
3.4.2. JNDI properties
要配置JNDI数据源,请在Activiti UI的属性文件中使用以下属性:
- datasource.jndi.name:数据源的JNDI名称。
- datasource.jndi.resourceRef:设置是否在J2EE容器中查找,即如果JNDI名称尚未包含前缀,则需要添加前缀“java:comp/env/”。 默认值是“true”。
3.5. 支持的数据库
下面列出的是Activiti用来引用数据库的类型(区分大小写!)。
Activiti database type | Example JDBC URL | Notes |
---|---|---|
h2 | jdbc:h2:tcp://localhost/activiti | Default configured database |
mysql | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | Tested using mysql-connector-java database driver |
oracle | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | jdbc:postgresql://localhost:5432/activiti | |
db2 | jdbc:db2://localhost:50000/activiti | |
mssql | jdbc:sqlserver://localhost:1433;databaseName=activiti (jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver)_OR_jdbc:jtds:sqlserver://localhost:1433/activiti (jdbc.driver=net.sourceforge.jtds.jdbc.Driver) | Tested using Microsoft JDBC Driver 4.0 (sqljdbc4.jar) and JTDS Driver |
3.6. 创建数所据库表
为数据库创建数据库表最简单的方法是:
- 将activiti-engine jar添加到你的类路径中
- 添加一个合适的数据库驱动
- 将Activiti配置文件(activiti.cfg.xml)添加到您的类路径中,指向您的数据库(请参阅数据库配置部分)
- 执行DbSchemaCreate类的主要方法
但是,通常只有数据库管理员才能在数据库上执行DDL语句。 在生产系统上,这也是最明智的选择。 SQL DDL语句可以在Activiti下载页面或Activiti分发文件夹的数据库子目录中找到。 脚本也在引擎jar(activiti-engine-x.jar)中,包org / activiti / db / create中(drop文件夹包含drop语句)。 SQL文件的形式
activiti.{db}.{create|drop}.{type}.sql
其中db是任何受支持的数据库,类型是
engine: 引擎执行所需的表, 必需。
identity: 包含用户,组和组的用户的表格。 这些表是可选的,应该在使用发动机附带的默认身份管理时使用。
history: 包含历史和审计信息的表。 可选:历史级别设置为无时不需要。 请注意,这也会禁用将数据存储在历史记录数据库中的一些功能(例如注释任务)。
MySQL用户请注意:低于5.6.4的MySQL版本不支持时间戳或毫秒级精度的日期。 更糟糕的是,有些版本在创建这样的列时会抛出异常,而其他版本则不会。 在进行自动创建/升级时,引擎在执行时会改变DDL。 当使用DDL文件的方法时,一个普通的版本和一个特殊的文件与mysql55在它是可用的(这适用于任何低于5.6.4)。 后面的文件将有列类型毫秒精度。
具体来说,以下适用于MySQL版本
- <5.6: 没有毫秒精度可用。 DDL文件可用(查找包含mysql55的文件)。 自动创建/更新可以直接使用。
- 5.6.0 - 5.6.3: 没有可用的毫秒精度。 自动创建/更新将不起作用。 建议无论如何升级到更新的数据库版本。 如果真的需要,可以使用mysql 5.5的DDL文件。
- 5.6.4+:可用的毫秒精度。 可用的DDL文件(包含mysql的默认文件)。 自动创建/更新可直接使用。
请注意,在稍后升级MySQL数据库并且已经创建/升级Activiti表的情况下,列类型更改将必须手动完成!
3.7. 数据库表名解释
Activiti的数据库名称都以ACT_开头。 第二部分是表格用例的两字符识别。 这个用例也将大致匹配服务API。
- ACT_RE_ *:RE代表仓库。 带有此前缀的表格包含静态信息,如流程定义和流程资源(图像,规则等)。
- ACT_RU_ *:RU代表运行时间。 这些是包含流程实例,用户任务,变量,作业等的运行时数据的运行时表。Activiti仅在流程实例执行期间存储运行时数据,并在流程实例结束时删除记录。 这使运行时间表小而快速。
- ACT_ID_ *:ID代表身份。 这些表格包含身份信息,例如用户,组等。
- ACT_HI_ *:HI代表历史。 这些表格包含历史数据,例如过去的流程实例,变量,任务等。
- ACT_GE_ *:一般数据,用于各种用例。
3.8. 数据库升级
确保在运行升级之前备份数据库(使用数据库备份功能)。
默认情况下,每次创建流程引擎时都会执行版本检查。 这通常发生在您的应用程序或Activiti网络应用程序启动时。 如果Activiti库注意到库版本和Activiti数据库表版本之间存在差异,则抛出异常。
要升级,您必须先将以下配置属性放入activiti.cfg.xml配置文件中:
<beans >
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- ... -->
<property name="databaseSchemaUpdate" value="true" />
<!-- ... -->
</bean>
</beans>
另外,为您的数据库添加一个合适的数据库驱动程序到类路径中。 升级应用程序中的Activiti库。 或者启动新版本的Activiti,并将其指向包含旧版本的数据库。 随着databaseSchemaUpdate设置为true,当注意到库和数据库模式不同步时,Activiti会自动将数据库模式升级到新版本。
作为替代,您也可以运行升级DDL语句。 也可以运行Activiti下载页面上提供的升级数据库脚本。
3.9. Job Executor (since version 6.0.0)
Activiti 5的异步执行程序是Activiti 6中唯一可用的作业执行程序,因为它是Activiti引擎中执行异步作业的更高性能和更具数据库友好的方式。 Activiti 5的老工作执行者被删除。 更多信息可以在用户指南的高级部分找到。
而且,如果在Java EE 7下运行,可以使用兼容JSR-236的ManagedAsyncJobExecutor来让容器管理线程。 为了启用它们,应该在配置中传递线程工厂,如下所示:
<bean id="threadFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/ee/concurrency/factory/default" />
</bean>
<bean id="customJobExecutor" class="org.activiti.engine.impl.jobexecutor.ManagedAsyncJobExecutor">
<!-- ... -->
<property name="threadFactory" ref="threadFactory" />
<!-- ... -->
</bean>
如果未指定线程工厂,则托管实现将回退到其默认对应方。
3.10. Job executor activation
AsyncExecutor是一个管理线程池以启动计时器和其他异步任务的组件。 其他实现也是可能的(例如使用消息队列,请参阅用户指南的高级部分)。
默认情况下,AsyncExecutor没有激活,没有启动。 通过以下配置,异步执行程序可以与Activiti引擎一起启动。
<property name="asyncExecutorActivate" value="true" />
属性asyncExecutorActivate指示Activiti引擎在启动时启动Async执行程序。
3.11. Mail server configuration
配置邮件服务器是可选的。 Activiti支持在业务流程中发送电子邮件。 要真正发送电子邮件,需要有效的SMTP邮件服务器配置。 有关配置选项,请参阅电子邮件任务。
3.12. History configuration
自定义历史存储的配置是可选的。 这使您可以调整影响引擎历史记录功能的设置。 查看历史配置了解更多详情。
<property name="history" value="audit" />
3.13. 在表达式和脚本中公开配置bean
默认情况下,您在activiti.cfg.xml配置或自己的Spring配置文件中指定的所有bean都可用于表达式和脚本。 如果要限制配置文件中bean的可见性,则可以在流程引擎配置中配置名为beans的属性。 ProcessEngineConfiguration中的beans属性是一个映射。 当您指定该属性时,只有该映射中指定的bean才会对表达式和脚本可见。 暴露的bean将暴露与您在该地图中指定的名称。
3.14. Deployment cache configuration
所有流程定义都被缓存(在它们被解析之后),以避免每次需要流程定义时触及数据库,并且流程定义数据也不会改变。 默认情况下,这个缓存没有限制。 要限制进程定义缓存,请添加以下属性
<property name="processDefinitionCacheLimit" value="10" />
设置这个属性会将默认的hashmap缓存与一个具有硬限制的LRU缓存交换。 当然,此属性的最佳值取决于所有运行时流程实例在运行时实际使用的流程定义总量和流程定义数量。
你也可以注入你自己的缓存实现。 这必须是一个实现org.activiti.engine.impl.persistence.deploy.DeploymentCache接口的bean:
<property name="processDefinitionCache">
<bean class="org.activiti.MyCache" />
</property>
有一个类似的属性叫做knowledgeBaseCacheLimit和knowledgeBaseCache,用于配置规则缓存。 这只在您的流程中使用规则任务时才需要。
3.15. Logging
所有日志记录(activiti,spring,mybatis,...)都通过SLF4J路由,并允许选择日志执行。
默认情况下,activiti-engine依赖关系中不存在SFL4J绑定jar,为了使用你所选择的日志框架,这应该被添加到你的项目中。 如果没有添加实现jar,SLF4J将使用NOP-logger,除了没有记录任何东西的警告之外,根本不记录任何东西。 有关这些绑定的更多信息http://www.slf4j.org/codes.html#StaticLoggerBinder.
用Maven,添加例如这样的依赖(这里使用log4j),注意你仍然需要添加一个版本:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
activiti-ui和activiti-rest webapps被配置为使用Log4j绑定。 运行所有活动模块的测试时也使用Log4j。
在类路径中使用具有公用日志记录的容器时的重要说明:为了通过SLF4J路由弹出日志记录,使用桥接(请参阅http://www.slf4j.org/legacy.html#jclOverSLF4J)。 如果您的容器提供公共日志记录实施,请按照此页面上的指示进行操作:http://www.slf4j.org/codes.html#release以确保稳定性。
使用Maven时的示例(版本省略):
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
3.16.映射的诊断上下文
Activiti支持SLF4j的Mapped Diagnostic Contexts功能。 这些基本的信息被传送到底层记录器,以及将要记录的内容:
- processDefinition ID为mdcProcessDefinitionID
- processInstance Id为mdcProcessInstanceID
- 执行ID为mdcExecutionId
这些信息都没有记录默认情况下。 记录器可以被配置为以期望的格式显示它们,除了通常记录的消息之外。 例如在Log4j中,以下样本布局定义会使记录器显示上述信息:
log4j.appender.consoleAppender.layout.ConversionPattern=ProcessDefinitionId=%X{mdcProcessDefinitionID}
executionId=%X{mdcExecutionId} mdcProcessInstanceID=%X{mdcProcessInstanceID} mdcBusinessKey=%X{mdcBusinessKey} %m%n
当日志包含需要实时检查的信息(例如通过日志分析器)时,这非常有用。
Activiti引擎中的事件机制允许您在引擎内发生各种事件时得到通知。 查看所有支持的事件类型,以查看可用事件的概述。
可以为特定类型的事件注册侦听器,而不是在发送任何类型的事件时得到通知。 您可以通过配置添加引擎范围的事件侦听器,使用API在运行时添加引擎范围的事件侦听器,或者将事件侦听器添加到BPMN XML中的特定流程定义。
所有派发的事件都是org.activiti.engine.delegate.event.ActivitiEvent的子类型。 该事件公开(如果可用)类型,executionId,processInstanceId和processDefinitionId。 某些事件包含与发生的事件相关的附加上下文,可在所有支持的事件类型的列表中找到有关附加有效内容的附加信息。
3.17.1. 事件监听器的实现
事件侦听器的唯一要求是实现org.activiti.engine.delegate.event.ActivitiEventListener
。 下面是一个监听器的示例实现,它将接收到的所有事件输出到标准输出,但与作业执行相关的事件除外:
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;
}
}
isFailOnException()方法确定在事件发送时onEvent(..)方法抛出异常的情况下的行为。 在返回false的情况下,该异常被忽略。 当返回true时,异常不会被忽略,冒泡,从而使当前正在执行的命令失效。 如果事件是API调用的一部分(或任何其他事务操作,例如作业执行),事务将被回滚。 如果事件侦听器中的行为不是关键业务,则建议返回false。
Activiti提供了一些基本的实现来促进事件监听器的常见用例。 这些可以用作基类或作为示例监听器实现:
org.activiti.engine.delegate.event.BaseEntityEventListener:一个事件侦听器基类,可用于侦听特定类型实体或所有实体的实体相关事件。 它隐藏了类型检查,并提供了4个应该被覆盖的方法:onCreate(..),onUpdate(..)和onDelete(..),当一个实体被创建,更新或删除。 对于所有其他与实体相关的事件,将调用onEntityEvent(..)。
3.17.2. 配置 和设置
如果在流程引擎配置中配置了事件侦听器,则在流程引擎启动时它将处于活动状态,并且在后续重新启动引擎后将保持活动状态。
属性eventListeners需要一个org.activiti.engine.delegate.event.ActivitiEventListener实例列表。 像往常一样,你可以声明一个内联的bean定义,或者改用一个现有的bean的ref。 下面的代码片段将一个事件侦听器添加到任何事件分派时通知的配置中,而不管其类型如何:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
...
<property name="eventListeners">
<list>
<bean class="org.activiti.engine.example.MyEventListener" />
</list>
</property>
</bean>
要在发送特定类型的事件时得到通知,请使用typedEventListeners属性,该属性需要映射。 地图条目的关键是逗号分隔的事件名称(或单个事件名称)列表。 map-entry的值是org.activiti.engine.delegate.event.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>
调度事件的顺序是根据听众添加的顺序确定的。 首先,按照在列表中定义的顺序调用所有常规事件侦听器(eventListeners属性)。 之后,如果调度了正确类型的事件,则会调用所有类型的事件侦听器(typedEventListeners属性)。
3.17.3. 在运行时添加监听器
通过使用API(RuntimeService),可以向引擎添加和删除附加的事件侦听器:
/**
* Adds an event-listener which will be notified of ALL events by the dispatcher.
* @param listenerToAdd the listener to add
*/
void addEventListener(ActivitiEventListener listenerToAdd);
/**
* Adds an event-listener which will only be notified when an event occurs, which type is in the given types.
* @param listenerToAdd the listener to add
* @param types types of events the listener should be notified for
*/
void addEventListener(ActivitiEventListener listenerToAdd, ActivitiEventType... types);
/**
* Removes the given listener from this dispatcher. The listener will no longer be notified,
* regardless of the type(s) it was registered for in the first place.
* @param listenerToRemove listener to remove
*/
void removeEventListener(ActivitiEventListener listenerToRemove);
请注意,引擎重新启动时,在运行时添加的侦听器不会被保留。
3.17.4. 将侦听器添加到流程定义
可以将侦听器添加到特定的流程定义中。 只能针对与流程定义相关的事件以及与以特定流程定义启动的流程实例相关的所有事件来调用侦听器。 可以使用完全限定的类名定义侦听器实现,该表达式解析为实现侦听器接口的bean,或者可以配置为引发消息/信号/错误BPMN事件。
监听器执行用户定义的逻辑
下面的代码片段为进程定义添加了2个监听器。 第一个侦听器将接收任何类型的事件,而侦听器实现则基于完全合格的类名。 第二个侦听器只有在作业成功执行或失败时才会被通知,使用已经在流程引擎配置的beans属性中定义的侦听器。
<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>
对于与实体相关的事件,也可以将侦听器添加到只有当某个实体类型发生实体事件时才通知的流程定义。 下面的代码展示了如何实现这一点。 它可以用于所有实体事件(第一个示例)或仅用于特定事件类型(第二个示例)。
<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>
entityType支持的值是:附件,注释,执行,身份链接,作业,流程实例,流程定义,任务。
监听器抛出BPMN事件