德玛西亚之WorkFlow(三)流程引擎配置与服务组件
1 配置文件
1.1 默认配置文件
工作流引擎默认会加载ClassPath路径下的 activiti.cfg.xml 文件。这样并不实用使用 spring 容器的配置。最简单的方式生成 ProcessEngine 就是使用 org.activiti.engine.ProcessEngines 生成:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
这将在ClassPaht 下查找 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。
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();
1.2 ProcessEngineConfiguration bean
在activiti.cfg.xml
必须包含有ID的Bean 'processEngineConfiguration'
。
<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事务。
1.3 数据库配置
有两种方法可以配置Activiti引擎将使用的数据库。第一个选项是定义数据库的JDBC属性:
- jdbcUrl:数据库的JDBC URL。
- jdbcDriver:实现特定数据库类型的驱动程序。
- jdbcUsername:用于连接数据库的用户名。
- jdbcPassword:连接数据库的密码。
基于提供的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="" />
使用数据库连接池(例如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
:在创建流程引擎时创建架构,并在关闭流程引擎时删除架构。
其他属性的配置
除前面介绍的属性外, Activiti 还提供了其他的属性配置,这些属性包括邮件服务、 历史数据配置、任务调度器等 对于某些属性,使用者可以不进行指定,使用 Activiti 提供的默认值即可,但是如果需要定制更个性化的流程引擎,还是需要知道这些属性的作用
history 配置
在流程执行的过程中,会产生一些流程相关的数据,例如流程实例、流程任务和流程参数等,随着流程的进行与结束,这些数据将会被从流程数据表中删除,为了能保存这些数据,Activiti 提供了历史数据表,可以将这些数据保存到历史数据表中。对于这些历史数据,保存到何种粒度, Activiti 提供了 history 属性对其进行配置 hi即可属性有点像 log4j 的日志输出级别,该属性有以下四个值
none 不保存任何的历史数据 因此,在流程执行过程中,这是最高效的
activity 级别高于 none ,保存流程实例与流程行为,其他数据不保存
audit: activity 级别会保存的数据外,还会保存全部的流程任务及其属性数据 audit 为 history 的默认值。
full :保存历史数据的最高级别,除了会保存 audit 级别的数据外,还会保存其他全部
流程相关的细节数据,包括 些流程参数等。
asyncExecutorActivate 配置
as cExecutorActivate 属性主要用于配置异步执行器是否启动, true 则表示 Activiti 在创建
流程引擎时,需要启动异步执行器,该属性默认值为也lse 。异步执行器启动后,会启动定时
器扫描并执行各种工作,如果查找到符合执行条件的工作,则会启动 条线程并交由线程池去
执行。
邮件服务器配置
Activiti 支持邮件服务,当流程执行到某一个节点时, Activiti 会根据流程文件配置 (EmailTask) ,发送邮件到相应的邮箱 以下为 ProcessEngineConfiguration 中提供的邮件服务器配置项。
- mailServerHost:邮件服务器地址,非必填,默认值为 localhost。
- mailServerHost : SMTP 发送邮件服务器端口,默认值为 250
- mailServerDefaultFrom :非必填,发送人的邮箱地址,默认值为 activiti@activiti.org。
- mailServerUsemame :邮箱登录用户名。
- mailServerPassword :邮箱登录密码。
- mailServerUseSSL :是否使用 SSL 协议通信,默认为 false。
- mailServerUseTLS :是否使用 TLS 协议通信,默认为 false。
1.4 支持的数据库
下面列出了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 |
1.5 Spring 集成
虽然你绝对可以使用没有Spring的Activiti,但我们提供了一些非常好的集成功能。
1.5.1 ProcessEngineFactoryBean
该ProcessEngine
可配置为一个普通的Spring bean。集成的起点是类org.activiti.spring.ProcessEngineFactoryBean
。该bean采用流程引擎配置并创建流程引擎。这意味着Spring的属性的创建和配置与配置部分中记录的相同。对于Spring集成,配置和引擎bean将如下所示:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
...
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
请注意,processEngineConfiguration
bean现在使用org.activiti.spring.SpringProcessEngineConfiguration
该类。
1.5.2 Transactions (事务)
我们将逐步解释在Spring分发示例中找到的SpringTransactionIntegration测试。下面是我们在本例中使用的Spring配置文件(您可以在SpringTransactionIntegrationTest Context.xml中找到它)。下面显示的部分包含数据源、TransactionManager、ProcessEngine和Activiti引擎服务。
当将数据源传递给SpringProcessEngineConfiguration(使用属性“datasource”)时,Activiti在内部使用org.springframework.jdbc.datasource.TransactionAwaredataSourceCroxy,它包装传递的数据源。这样做是为了确保从数据源和Spring事务中检索到的SQL连接能够良好地协同工作。这意味着,在Spring配置中不再需要自己代理数据源,尽管它仍然允许将TransactionWaredataSource代理传递到SpringProcessEngineConfiguration中。在这种情况下,不会发生额外的包装。
确保在自己在Spring配置中声明TransactionWaredataSourceCroxy时,不会将其用于已经知道Spring事务的资源(例如,DataSourceTransactionManager和JPatransactionManager需要未代理的数据源)。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="asyncExecutorActivate" value="false" />
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
...
这个Spring配置文件的其余部分包含了bean和我们将在这个特定示例中使用的配置:
<beans>
...
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="userBean" class="org.activiti.spring.test.UserBean">
<property name="runtimeService" ref="runtimeService" />
</bean>
<bean id="printer" class="org.activiti.spring.test.Printer" />
</beans>
2 服务组件
RepositoryService:提供一系列管理流程定义和流程部署的API。
RuntimeService:在流程运行时对流程实例进行管理与控制。
TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务分本任务等。
IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户以及它们之间的关系。
ManagementService:提供对流程引擎进行管理和维护的服务。
HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
DynamicBpmnService:使用该服务,可以不需要重新部署流程模型,就可以实现对流程模型的部分修改。
爷儿您要是看的乐,打个赏也让姑娘乐一乐