Activiti学习笔记
Activiti是一个开源的工作流引擎,主页在http://www.activiti.org/,要下载的话直接点上面的download就可以啦。下载下来的东西里面有document,tutorial,还有需要的所有的jar包,还有一些demo。目前最新的版本是activit-5.9
这个项目的project leader是鼎鼎大名的Tom Baeyens,据说他以前是做jbpm的,做到jbpm4的时候,他离开了JBoss,到了Alfresco公司,组建起了这个Activiti研发团队,某种程度上,可以说这个Activiti才是真正jbpm5,而现在所谓的jbpm5几乎放弃了jbpm4的所有代码,从新开始,是以前的drool flow。
下载到的zip文件解压之后,第一件事当然是去看里面的document了,有个readme.html就是了。
看看看,他会告诉你怎么去运行它的demo,就是到setup目录下运行ant demo.start。我当时运行的时候,还出了点问题。运行demo.start会做几件事情:
1. 会自动建立H2数据库,建表,倒入数据
2. 自动联网去下载一个适合版本的tomcat,具体的配置信息在setup目录下的build.properties和build.db.properties中查看
3. 自动发布工程activiti-explorer和activiti-rest到那个tomcat上
4. 给你打开浏览器,访问这个工程activiti-explorer
太傻瓜,太自动化了。
如果自己已经有了好的tomcat,而且不想然它去下载,那也简单,只要按
build.properties中的配置,添加你的tomcat到上面命令生成downloads目录,而且修改恰当的tomcat版本号,就可以了。
如果不出意外,你一步到位的跑完,你已经看到activiti-explorer的登录界面了,这个demo默认的登录用户文档中说了,比如管理员kermit/kermit,登录上去玩吧。登录上去以后可以看到task,process和database,database是管理员才可以看到的。database可以看到数据库里面的数据。这些数据保存在H2中的,有兴趣的自己去研究一下这个H2数据库,只要一个jar包,嵌入式的,牛逼着呢,呵呵。
点到process上,可以看到一些已经发布了的流程demo,右上角有个startprocess的按钮,可以启动一个流程的。流程启动了就需要人去完成的,如果流程启动以后,当前登录用户碰巧可以做这个task,那么当前用户就会受到一个Inbox的task,点开Task,Inbox有了。如果流程定义的时候task是给一个group的话,那么就说明这个group的人都可以完成这个任务,如果当前用户想做的话,就claim它。
废话有点多了。还是好好看document,tutorial吧!
实际项目运用中,我们不会把数据存在H2上面的,一般Oracle,mysql。现在我们拿mysql说事。也很简单,首先在你的mysql中建立一个数据库,比如名为activiti吧,不需要建立表的,只要空数据库。
在eclipse上建立一个Java Project,导入{activiti}\setup\files\dependencies\libs.engine.runtime.txt中列出的jar包,另外加一个mysql的驱动包,由于下面activiti.cfg.xml的配置,这里需要用到commons-dbcp和commons-pool包,也要加进来,就可以啦。
然后在工程的源文件目录下新建一个activiti.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="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="root" />
- <property name="password" value="leonsu" />
- <property name="defaultAutoCommit" value="false" />
- </bean>
- <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
- <property name="databaseSchemaUpdate" value="true"/>
- <!--
- <property name="jdbcUrl" value="jdbc:h2:tcp://localhost/activiti" />
- <property name="jdbcDriver" value="org.h2.Driver" />
- <property name="jdbcUsername" value="sa" />
- <property name="jdbcPassword" value="" />
- -->
- <property name="dataSource" ref="dataSource" />
- <property name="jobExecutorActivate" value="true" />
- </bean>
- </beans>
<?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="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="root" />
<property name="password" value="leonsu" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="databaseSchemaUpdate" value="true"/>
<!--
<property name="jdbcUrl" value="jdbc:h2:tcp://localhost/activiti" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
-->
<property name="dataSource" ref="dataSource" />
<property name="jobExecutorActivate" value="true" />
</bean>
</beans>
现在运行activiti-engine-5.x.jar包中org.activiti.engine.impl.db.DbSchemaCreate这个类,对了有源码的,activiti-engine-5.x-sources.jar这个包就是对应的源码了,DbSchemaCreate的源码:
- /* Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.activiti.engine.impl.db;
- import org.activiti.engine.ProcessEngineConfiguration;
- import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
- import org.activiti.engine.impl.util.LogUtil;
- /**
- * @author Tom Baeyens
- */
- public class DbSchemaCreate {
- static {
- LogUtil.readJavaUtilLoggingConfigFromClasspath();
- }
- public static void main(String[] args) {
- ProcessEngineConfiguration
- .createProcessEngineConfigurationFromResourceDefault()
- .setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE)
- .buildProcessEngine();
- }
- }
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl.db;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.util.LogUtil;
/**
* @author Tom Baeyens
*/
public class DbSchemaCreate {
static {
LogUtil.readJavaUtilLoggingConfigFromClasspath();
}
public static void main(String[] args) {
ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE)
.buildProcessEngine();
}
}
从这里看,这段代码还是Tom写的呢。
运行它的main方法就可以自动建立数据库了,很简单的啦。
至于它后台怎么交互数据库,详细代码,自己去查源码深究吧,他这里使用mybatis作为ORM层框架的。
另外org.activiti.db.create下面有sql文件,你觉得这样麻烦,想自己跑这些sql语句也可以的。不过,新建上面这个Java Project很有用,下面的学习有用的。
这些sql文件跑完只有表结构,都是空表。
如果想导入数据,比如想连接mysql,不想连接H2 来运行这个activiti-explorer,可以去{activiti}\setup\build\demo\h2.data.sql看,跑一下这个sql文件就OK啦。
然后还需要修改tomcat/webapp/下面的activiti-explorer和activiti-rest的数据库连接,改到mysql上面,并且导入必要的jar包,如mysql驱动包。
重新启动tomcat就可以将数据库切换到mysql来运行demo了。
下面才是核心,那就是学习Activiti工作流引擎的API了。
关于配置文件的配置,关于ProcessEngine类,关于流程定义语法规则,关于如何发布流程到引擎上,如何启动一个流程,如何获得工作列表,等等。。。
其实很简单,核心都在ProcessEngine,由它产生各种Service来完成以上的工作。