一、创建一个ProcessEngine
Activiti的流程引擎是通过activiti.cfg.xml这个文件进行配置的。这种方式区别于你用spring的方式去创建一个流程引擎。那么,关于用spring的方式去创建流程引擎,我们后面再讲。
获得一个ProcessEngine最简单的方式,是用org.activiti.engine.ProcessEngine这个类。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
|
它会自己在classpath中寻找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="jobExecutorActivate" 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这个对象。
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
所有的这些ProcessEngineConfiguration.getXXX()方法都返回一个ProcessEngineConfiguration对象。在调用buildProcessEngine()操作之后,一个ProcessEngine对象被创建。
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration() .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE) .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000") .setJobExecutorActivate(true) .buildProcessEngine();
二、ProcessEngineConfiguration实体
activiti.cfg.xml这个文件必须包含一个id是processEngineConfiguration的实体。
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
这个bean实体会被用于构造ProcessEngine对象。有不止一个类能够定义这processEngineConfiguration。这些类代表着不同的使用环境和一些默认的设置。选择一个尽可能匹配你的环境的类,通过减少属性的数量去配置一个引擎是最好的一种练习。下面的这些类是能直接获取得到的。
- org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:这个流程引擎被用于标准的方式。Activiti会留意到事物。
- org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:这是一个为单元测试来说很方便的一个类。Activiti会留意到事物。默认使用一个H2 类型的内存的数据库。当引擎被初始化或者关闭的时候,这个数据库也会被创建或者消除。当用这个类的时候,通常来说不用额外的配置。
- org.activiti.spring.SpringProcessEngineConfiguration:用于在spring环境中的创建流程引擎。
- org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:当引擎运行在单机模式和Jta事物下会被用到。
三、数据库配置
Activiti引擎会识别两种方式去配置数据库。第一种是定义数据库用到的JDBC 属性:
- jdbcUrl:数据库的JDBC连接地址。
- jdbcDriver:数据库依赖的驱动。
- jdbcUserName:连接数据库的用户名。
- jdbcPassword:连接数据库的密码。
- jdbcMaxActiveConnections:连接池在任何时候能包含的最大活动数量,默认值是10。
- jdbcMaxIdleConnections:连接池中能够存在的最大空闲连接数。
- jdbcMaxCheckoutTime:
- jdbcMaxWaitTime:这是一个级别很低的设置。它能让连接池打印日志,并且能够在比平时连接时间长的时候,再试图获取一个连接。
数据库配置的例子:
<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="" />
另外,javax.sql.DataSource的实现类也能用于创建数据库.
<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没有这样一个类库会去创建一个这样的数据源,因此,你必须在你的类路径下有这样的一个类库。
四、支持的数据库
列表里面展示的都是activiti支持的数据库
h2 | 1.3.168 | jdbc:h2:tcp://localhost/activiti | Default configured database |
mysql | 5.1.21 | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | Tested using mysql-connector-java database driver |
oracle | 11.2.0.1.0 | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | 8.1 | jdbc:postgresql://localhost:5432/activiti | |
db2 | DB2 10.1 using db2jcc4 | jdbc:db2://localhost:50000/activiti | |
mssql | 2008 using sqljdbc4 | jdbc:sqlserver://localhost:1433/activiti |
五、创建数据库的表
最简单的创建你数据库的表的方法就是:
- 在你的类路径下添加一个activiti-engine的诸多jar包。
- 添加一个合适的数据库驱动。
- 在你的类路径下添加一个activiti.cfg.xml配置文件,指向你的数据库。
- 执行DbSchemaCreate的main方法。
activiti.{db}.{create|drop}.{type}.sql
db是任何一种activiti支持的数据库,type是
- engine:引擎执行必备的表。
- identity:这些表包含着用户、组和用户组的成员。当引擎需要默认的身份管理时,会选择性的用到这些表。
- history:这一部分表包含着历史和审计信息。
Activiti中数据库表的名字都是以ACT_开头。第二部分是两个字母用来区分不同的表。这样用也是匹配API。
- ACT_RE_*:'RE'代表repository。有这样前缀的表包含'static'的信息,比如流程定义和流程资源(图片、规则)..。
- ACT_RU_*:'RU'代表runtime.这些表是运行中的表,包含了流程实例中实时的数据,用户任务,变量,工作等。当流程实例执行的时候,Activiti之存储实时的数据,当一个流程实例结束的时候,会删除掉记录。这样保证了这些表小且快。
- ACT_ID_*:'ID'代表identity。这些表包含了身份信息,比如用户、组等。
- ACT_HI_*:'HI'代表history。这些包含了历史数据,比如过去的流程实例、变量、任务等。
- ACT_GE_*:general 数据。这些数据用在各种各样的案例中。
在数据库升级之前,一定要确保已经备份完成。
通常来说,每当一个流程引擎创建,都会检查一下版本。特别是在你的应用或者Activiti应用包启动的时候经常会出现升级。如果Activiti提示你,你的库版本和数据库表的版本有区别,这时候,其实是抛了异常。
要升级数据库,你不得不在你的activiti.cfg.xml文件中把下面的属性配置在文件的开头部分。
<beans ... > <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- ... --> <property name="databaseSchemaUpdate" value="true" /> <!-- ... --> </bean> </beans>
因此,在你的classpath中你要选择一个合适的数据库驱动为你的数据库。在你的应用程序中升级数据库,或者启动一个新的Activiti的版本,并且要指向一个包含老版本的数据库。databaseSchemaUpdate设置为true,是指当提示类库和DB不同步时,Activiti首先会自动升级DB到你的新版本中。
不过你也可以通过运行升级DDL作为替代。你可以在activiti下载页面,找到数据库升级脚本,运行这个升级脚本。
八、计划执行器
JobExecutor是一个管理一系列线程的组件,它会执行异步消息和定时器。对于单元测试的情况来说,它和多个线程在一起很不方便。因此,API允许通过API去查询并且执行计划,以致于计划的执行能被一个单元测试去控制。为了避免被计划执行器(JobExecutor)干扰,也能关闭它。
默认的, 当流程引擎启动的时候,JobExecutor会被激活。详细说明如下,
<property name="jobExecutorActivate" value="false" /> |
设置为false,就是指当流程引擎启动的时候,你不想JobExecutor激活。
九、邮件服务配置
配置一个邮件服务不是必须的,这个根据你自己的需要设置。Activiti支持在业务流程中发送邮件。要想实际的发送一封邮件,必须配置一个正确的SMPT邮件服务。
下面列出的属性能够在activiti.cfg.xml文件中配置:
mailServerHost | no | The hostname of your mail server (e.g. mail.mycorp.com). Default is localhost |
mailServerPort | yes, if not on the default port | The port for SMTP traffic on the mail server. The default is 25 |
mailServerDefaultFrom | no | The default e-mail address of the sender of e-mails, when none is provided by the user. By default this is[email protected] |
mailServerUsername | if applicable for your server | Some mail servers require credentials for sending e-mail. By default not set. |
mailServerPassword | if applicable for your server | Some mail servers require credentials for sending e-mail. By default not set. |
mailServerUseSSL | if applicable for your server | Some mail servers require ssl communication. By default set to false. |
这个要结合任务进行说明,后续再详细进行讲解。
十、历史配置
历史存储的配置是按照特定需求自选配置的。这需要你微调一下配置去影响对引擎的历史数据处理能力。
<property name="history" value="audit" /> |
十一、在表达式和脚本中暴露配置的实体类
默认的,你在activiti.cfg.xml中配置信息指定的所有实体类,或者在你Spring自己的配置文件中所有实体类,都能用在表达式和脚本中。如果你想在你的配置文件中限制实体类的可见性,你可以在你的流程引擎中去配置一个名为bean的属性。在ProcessEngineConfiguration中,这些实体类的属性都是一个map。当你指定这个属性的时候,只有被指定的类才会对表达式或者脚本可见。这些类会以你在map中指定的名字暴漏出来。
十二、部署缓存配置
所有的流程定义都是高速缓存存储器(在他们被解析之后),为了去避免和数据库冲突。因为流程定义的数据不会变化,所以每次一个流程定义的时候,都会需要到数据库。默认的,在缓存中流程定义的数量没有限制。下面的例子是告诉我们如果去限制缓存中流程定义的数量。
<property name="processDefinitionCacheLimit" value="10" /> |
十三、日志
Activiti 5.12中,SLF4J被作为日志框架,代替了之前的java.util.logging。所有的日志(activiti/spring/mybatis...)都会经过SLF4J过滤,并且允许在你的选择的logging-implementation中进行选择。
默认的,在activiti-engine的依赖中现在没有SFL4J-binding的jar包。为了应用这个日志框架,你需要手动添加到你的项目中。