⼯作流引擎详解!⼯作流开源框架ACtiviti的详细配置以及安装
和使⽤
创建ProcessEngine
Activiti流程引擎的配置⽂件是名为l的XML⽂件.注意与使⽤Spring⽅式创建流程引擎是不⼀样的
使⽤ine.ProcessEngines类,获得ProcessEngine:
ProcessEngine processEngine = DefaultProcessEngine()
它会在classpath下搜索l,并基于这个⽂件中的配置构建引擎
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="ine.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="jobExecutorActivate" value="false" />
<property name="mailServerHost" value="-corp" />
<property name="mailServerPort" value="5025" />
</bean>
</beans>
配置⽂件中使⽤的ProcessEngineConfiguration可以通过编程⽅式创建,可以配置不同的bean id
如果不使⽤配置⽂件进⾏配置,就会基于默认创建配置
buildProcessEngine()后, 就会创建⼀个ProcessEngine:
ProcessEngine processEngine = ateStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.setJobExecutorActivate(true)
.buildProcessEngine();
ProcessEngineConfiguration bean
l必须包含⼀个id='processEngineConfiguration' 的bean
<bean id="processEngineConfiguration" class="ine.impl.cfg.StandaloneProcessEngineConfiguration">
这个bean会⽤来构建ProcessEngine. 有多个类可以⽤来定义processEngineConfiguration. 这些类对应不同的环境,并设置了对应的默认值:
ine.impl.cfg.StandaloneProcessEngineConfiguration: 单独运⾏的流程引擎.Activiti会⾃⼰处理事务.默认数据库只在引擎启动时检测(如果没有Activiti的表或者表结构不正确就会抛出异常)
ine.impl.cfg.StandaloneInMemProcessEngineConfiguration: 单元测试时的辅助类.Activ
iti会⾃⼰控制事务. 默认使⽤H2内存数据库,数据库表会在引擎启动时创建,关闭时删除.使⽤它时,不需要其他配置(除⾮使⽤job执⾏器或邮件功能)
org.activiti.spring.SpringProcessEngineConfiguration: 在Spring环境下使⽤流程引擎
ine.impl.cfg.JtaProcessEngineConfiguration: 单独运⾏流程引擎,并使⽤JTA事务
数据库配置
定义数据库配置参数
基于数据库配置参数定义数据库连接配置
jdbcUrl: 数据库的JDBC URL
jdbcDriver: 对应不同数据库类型的驱动
jdbcUsername: 连接数据库的⽤户名
jdbcPassword: 连接数据库的密码
基于JDBC参数配置的数据库连接会使⽤默认的MyBatis连接池,配置MyBatis连接池:
jdbcMaxActiveConnections: 连接池中处于被使⽤状态的连接的最⼤值.默认为10
jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最⼤值
jdbcMaxCheckoutTime: 连接被取出使⽤的最长时间,超过时间会被强制回收. 默认为20000(20秒)
jdbcMaxWaitTime: 这是⼀个底层配置,让连接池可以在长时间⽆法获得连接时, 打印⼀条⽇志,并重新尝试获取⼀个连接.(避免因为错误配置导致沉默的操作失败) 默认为20000(20秒)
使⽤javax.sql.DataSource配置
Activiti的发布包中没有这些类, 要把对应的类放到classpath下
<bean id="dataSource" class="org.apachemons.dbcp.BasicDataSource" >
<property name="driverClassName" value="sql.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="ine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
...
</bean>
⽆论使⽤JDBC还是DataSource,都可以设置下⾯的配置:
databaseType:
⼀般不⽤设置,因为可以⾃动通过数据库连接的元数据获取
只有⾃动检测失败时才需要设置.可能的值有:{h2,mysql,oracle,postgres,mssql,db2}
如果没使⽤默认的H2数据库就必须设置这项.这个配置会决定使⽤哪些创建/删除脚本和查询语句
databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表
false:默认, 检查数据库表的版本和依赖库的版本,如果版本不匹配就抛出异常
true: 构建流程引擎时,执⾏检查,如果需要就执⾏更新. 如果表不存在,就创建
create-drop: 构建流程引擎时创建数据库表,关闭流程引擎时删除这些表
JNDI数据库配置
在默认情况下,Activiti的数据库配置会放在web应⽤的WEB-INF/classes⽬录下的db.properties⽂件中. 这样做⽐较繁琐,因为要⽤户在每次发布时,都修改Activiti源码中的db.properties并重新编译war⽂件,或者解压缩war⽂件,修改其中的db.properties
使⽤ JNDI(Java命名和⽬录接⼝) 来获取数据库连接,连接是由servlet容器管理的,可以在war部署外边管理配置. 与db.properties相⽐,它也允许对连接进⾏更多的配置
JNDI的使⽤
Activiti Explorer和Activiti Rest应⽤从db.properties转换为使⽤JNDI数据库配置:
需要打开原始的Spring配置⽂件:
activiti-webapp-explorer/src/main/webapp/l
activiti-webapp-rest2/src/main/l
删除dbProperties和dataSource两个bean,然后添加如下bean:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/activitiDB"/>
</bean>
我们需要添加包含了默认的H2配置的l⽂件
如果已经有了JNDI配置,会覆盖这些配置.对应的配置⽂件activiti-webapp-explorer2/src/main/webapp/l:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/activiti-explorer2">
<Resource auth="Container"
name="jdbc/activitiDB"
type="javax.sql.DataSource"
scope="Shareable"
description="JDBC DataSource"
url="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000"
driverClassName="org.h2.Driver"
username="sa"
password=""
defaultAutoCommit="false"
initialSize="5"
maxWait="5000"
maxActive="120"
maxIdle="5"/>
</Context>
如果是Activiti REST应⽤,则添加activiti-webapp-rest2/src/main/webapp/l:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/activiti-rest2">
<Resource auth="Container"
name="jdbc/activitiDB"
type="javax.sql.DataSource"
scope="Shareable"
description="JDBC DataSource"
url="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=-1"
driverClassName="org.h2.Driver"
username="sa"
password=""
defaultAutoCommit="false"
initialSize="5"
maxWait="5000"
maxActive="120"
maxIdle="5"/>
</Context>
最后删除Activiti Explorer和Activiti Rest两个应⽤中不再使⽤的db.properties⽂件
JNDI的配置
JNDI数据库配置会因为使⽤的Servlet container不同⽽不同
Tomcat容器中的JNDI配置如下:
JNDI资源配置在CATALINA_BASE/conf/[enginename]/[hostname]/[warname].xml(对于Activiti Explorer来说,通常是在
CATALINA_BASE/conf/Catalina/localhost/activiti-explorer.war) 当应⽤第⼀次发布时,会把这个⽂件从war中复制出来.所以如果这个⽂件已经存在了,需要替换它.修改JNDI资源让应⽤连接mysql⽽不是H2:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/activiti-explorer2">
<Resource auth="Container"
name="jdbc/activitiDB"
type="javax.sql.DataSource"
description="JDBC DataSource"
url="jdbc:mysql://localhost:3306/activiti"
driverClassName="sql.jdbc.Driver"
username="sa"
password=""
defaultAutoCommit="false"
initialSize="5"
maxWait="5000"
maxActive="120"
maxIdle="5"/>
</Context>
Activiti⽀持的数据库
h2: 默认配置的数据库
mysql
oracle
postgres
db2
mssql
创建数据库表
创建数据库表的⽅法:
activiti-engine的jar放到classpath下
添加对应的数据库驱动
把Activiti配置⽂件(l)放到classpath下,指向你的数据库
执⾏DbSchemaCreate类的main⽅法
SQL DDL语句可以从Activiti下载页或Activiti发布⽬录⾥到,在database⼦⽬录下.
脚本也包含在引擎的jar中:activiti-engine-x.jar在org/activiti/db/create包下,drop⽬录⾥是删除语句
- SQL⽂件的命名⽅式如下:
[activiti.{db}.{create|drop}.{type}.sql]
type 是:
- engine:引擎执⾏的表,必须
- identity:包含⽤户,组,⽤户与组之间的关系的表.这些表是可选的,只有使⽤引擎⾃带的默认⾝份管理时才需要
- history:包含历史和审计信息的表,可选的.历史级别设为none时不会使⽤. 注意这也会引⽤⼀些需要把数据保存到历史表中的功能
数据库表名理解
Activiti的表都以ACT_开头, 第⼆部分是表⽰表的⽤途的两个字母标识.⽤途和服务的API对应
ACT_RE_*: RE表⽰repository. 这个前缀的表包含了流程定义和流程静态资源
ACT_RU_*: RU表⽰runtime. 这些是运⾏时的表,包含流程实例,任务,变量,异步任务等运⾏中的数据. Activiti只在流程实例执⾏过程中保存这些数据,在流程结束时就会删除这些记录.这样运⾏时表可以⼀直很⼩速度很快
ACT_ID_*: ID 表⽰identity. 这些表包含⾝份信息. ⽐如⽤户,组等等
ACT_HI_*: HI 表⽰history. 这些表包含历史数据. ⽐如历史流程实例, 变量,任务等等mysql下载后如何使用
ACT_GE_*: 通⽤数据. ⽤于不同场景下
数据库升级
在执⾏更新之前要先使⽤数据库的备份功能备份数据库
默认情况下,每次构建流程引擎时都会进⾏版本检测.这⼀切都在应⽤启动或Activiti webapp启动时发⽣.如果Activiti发现数据库表的版本与依赖库的版本不同,就会抛出异常
对l配置⽂件进⾏配置来升级:
<beans ... >
<bean id="processEngineConfiguration" class="ine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- ... -->
<property name="databaseSchemaUpdate" value="true" />
<!-- ... -->
</bean>
</beans>
然后,把对应的数据库驱动放到classpath⾥.升级应⽤的Activiti依赖,启动⼀个新版本的Activiti指向包含旧版本的数据库,将
databaseSchemaUpdate设置为true,Activiti会⾃动将数据库表升级到新版本
当发现依赖和数据库表版本不通过时,也可以执⾏更新升级DDL语句
也可以执⾏数据库脚本,可以在Activiti下载页到
启⽤Job执⾏器
JobExecutor是管理⼀系列线程的组件,可以触发定时器(包含后续的异步消息).
在单元测试场景下,很难使⽤多线程.因此API允许查询ateJobQuery) 和执⾏Job
(uteJob),
因此Job可以在单元测试中控制, 要避免与job执⾏器冲突,可以关闭它
默认,JobExecutor在流程引擎启动时就会激活. 如果不想在流程引擎启动后⾃动激活JobExecutor,可
以设置
<property name="jobExecutorActivate" value="false" />
配置邮件服务器
Activiti⽀持在业务流程中发送邮件,可以在配置中配置邮件服务器
配置SMTP邮件服务器来发送邮件
配置历史存储
Activiti可以配置来定制历史存储信息
<property name="history" value="audit" />
表达式和脚本暴露配置
默认情况下,l和Spring配置⽂件中所有bean 都可以在表达式和脚本中使⽤
如果要限制配置⽂件中的bean的可见性,可以通过配置流程引擎配置的beans来配置
ProcessEngineConfiguration的beans是⼀个map.当指定了这个参数,只有包含这个map中的bean可以在表达式和脚本中使⽤.通过在map中指定的名称来决定暴露的bean
配置部署缓存
因为流程定义的数据是不会改变的,为了避免每次使⽤访问数据库,所有流程定义在解析之后都会被缓存
默认情况下,不会限制这个缓存.如果想限制流程定义缓存,可以添加如下配置
<property name="processDefinitionCacheLimit" value="10" />
这个配置会把默认的HashMap缓存替换成LRU缓存来提供限制. 这个配置的最佳值跟流程定义的总数有关,实际使⽤中会具体使⽤多少流程定义也有关
也可以注⼊⾃定义的缓存实现,这个bean必须实现ine.impl.persistence.deploy.DeploymentCache接⼝
<property name="processDefinitionCache">
<bean class="org.activiti.MyCache" />
</property>
类似的配置有knowledgeBaseCacheLimit和knowledgeBaseCache, 它们是配置规则缓存的.只有流程中使⽤规则任务时才⽤
⽇志
从Activiti 5.12开始,所有⽇志(activiti,spring,,mybatis等等)都转发给slf4j允许⾃定义⽇志实现
引⼊Maven依赖log4j实现,需要添加版本
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
使⽤Maven的实例,忽略版本
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
映射诊断上下⽂
Activiti⽀持slf4j的MDC功能, 如下的基础信息会传递到⽇志中记录:
流程定义ID: mdcProcessDefinitionID
流程实例ID: mdcProcessInstanceID
分⽀ID: mdcexecutionId
默认不会记录这些信息,可以配置⽇志使⽤期望的格式来显⽰它们,扩展通常的⽇志信息. ⽐如,通过log4j配置定义会让⽇志显⽰上⾯的信息:
soleAppender.layout.ConversionPattern =ProcessDefinitionId=%X{mdcProcessDefinitionID}
executionId=%X{mdcExecutionId}mdcProcessInstanceID=%X{mdcProcessInstanceID} mdcBusinessKey=%X{mdcBusinessKey} %m%n"
当系统进⾏⾼风险任务,⽇志必须严格检查时,这个功能就⾮常有⽤,要使⽤⽇志分析的情况
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论