学习JBPM前,先了解一下JBPM。
百科:
JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务
协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源代码项目,使用它要遵循
ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。
jBPM特色
就是它的业务逻辑定义没有采用目前的一些规范,如WfMC´s XPDL, BPML, ebXML, BPEL4WS等,而是采用
了它自己定义的JBoss jBPM Process definition language (jPdl)。jPdl认为一个业务流程可以被看作是一个
UML状态图。jPdl就是详细定义了这个状态图的每个部分,如起始、结束状态,以及状态之间的转换,通过图型
化的流程定义,直观地描述业务流程。
jBPM的另一个特色是它使用Hibernate来管理它的数据库。Hibernate是目前Java领域非常流行的一种数据存储
层解决方案,只要是 Hibernate 支持的数据库, jBPM 也就支持。通过Hibernate,jBPM将数据的管理职能分离
出去,自己专注于业务逻辑的处理。
工作流程
1) jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库。只要是Hibernate支持的数据库,jBPM
就支持。数据库的初始化可以由jBPM自动完成,也可以通过ant generate.ddl任务生成SQL语句,在jBPM外部自
己创建所需的表。
2) 使用jPdl定义工作流,生成processdinination.xml文件。可以采用GUI工具gpdl,但目前只支持jBPM1.0,
而且bug很多。XML的DTD定义文件在jBPM下载包中。
3) Ant create.pde生成pde包的工作目录。将processdinination.xml文件和其它需要的文件放在指定的目录下
,使用ant build.precess.archives生成pde包。pde包的格式采用jar。
4) 更改pde工作目录/src/config/jbpm.properties的相关属性,主要是设定相关的数据库连接信息。注意要将
数据库的JDBC驱动放在pde工作目录的lib目录下。
5) Ant deploy.process.archives将刚才生成的pde部署到数据库。实际上就是向数据库插入一些相关数据。
6) 利用jBPM API函数开发相应的工作流程。
jbpm官网: http://www.jboss.org/jbpm/
下载链接: http://sourceforge.net/projects/jbpm/files/
我的工程使用SSH框架搭建。在讲jbpm前,这个工程已经搭建好了。
在此基础上我们把jbpm整合进我的工程。
一,下载jbpm的jar包。
下载链接: http://sourceforge.net/projects/jbpm/files/
我使用的是jbpm4.4这个版本,应为这个版本相对稳定,而且网上对应的资料也很好找到。
解压后看看目录结构:
doc: 里面是相关文档。包括开发向导,api,用户向导。
examples: 一个样例。
install: 安装脚本(这个很重要)。
lib: 第三方jar包。
src: JBPM的源码。(这个源码其实比jbpm.jar包中的文件要少,应该是核心源码吧)
jbpm.jar :JBPM的jar包
******************************************************************************
下面开始详细查看install目录。
downloads:空的。
jdbc :这个目录里给出了链接数据库配置的properties文件样本(链接数据库字符串),例如如果我们使
用mysql数据库,
mysql.properties文件内容:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jbpmdb
jdbc.username=jbpm
jdbc.password=jbpm
明白一个就知道其他文件是干嘛的了。
src :这个目录给出了创建数据库的脚本,jbpm配置文件,以及在不同数据库,使用Hibernate配置
不同数据源和使用HIbernate文件和使用spring配置下的各种样本。总之,就是你在使用Hibernate和spring
时要要配置数据源,对各种方式,这个目录下都有模板。同时还有对日志和邮件的配置。gpd目录下海有
eclipse
的插件包。
build.xml:ant的构建文件。
********************************************************************************
该说该看的都大概了解了,现在把jar包加进来,引入到classpath。
二,安装eclipse插件。
在jbpm-4.4\install\src\gpd下找到jbpm-gpd-site.zip。
在Eclipse中找菜单Help -> Install new software。
点击Add按钮,弹出框中,name随便写,点击Archive..按钮,找到jbpm-gpd-site.zip。
安装后重启Eclipse。
在菜单,window->Preferences中能看到JBoss jBPM.
三,创建数据库。
在jbpm-4.4\install\src\db下能看到4个文件夹:
create,drop,upgrade-4.0-to-4.1,upgrade-4.1-to-4.2。
每个目录里都对应了hsqldb,mysql,oracle,postgresql的脚本。
我打算使用mysql数据库,找到create下的jbpm.mysql.create.sql文件,把里面创建表的
sql执行。这样就创建好了需要的表。可以先往表里写一些数据,jbpm-4.4\install\src\demo下有个
example.identities.sql就是插入测试数据的脚本
从上面的图片可以看出有18张表。
这些表都是干吗用的呢?
从网上找了些资料,先做一下了解,以后再详细研究:
--------------------------------------------------------------------------
1资源库和运行时表结构:
JBPM4_DEPLOYMENT,JBPM4_DEPLOYPROP,JBPM4_LOB存储流程定义相关的部署信息
JBPM4_EXECUTION主要是存放JBPM4的执行信息,Execution机制代替了JBPM3的Token机制
JBPM4_TASK存放需要人来完成的Activities(活动),需要人来参与完成的Activity 被称为Task
JBPM4_PARTICIPATION参与者表,存放参与者信息,参与者的种类有
Candidate、Client、Owner、Replaced Assignee和Viewer。
而具体的参与者既可以是单一用户,也可以是用户组
JBPM4_SWIMLANE泳道表。SwimLane是一种Runtime Process Role。
通过SwimLane,多个Task可以一次分配到同一Actor身上
JBPM4_JOB 存放的是Timer 的定义
JBPM4_VARIABLE 存的是进行时的临时变量。
2历史数据库表结构:
JBPM4_HIST_PROCINST 与JBPM4_HIST_ACTINST 分别存放Process Instance和Activity Instance的历史记录
JBPM4_HIST_DETAIL 保存 Variable的变更记录
JBPM4_HIST_VAR 保存历史的变量 JBPM4_HIST_TASK Task的历史信息
3身份认证表结构
JBPM4_ID_GROUP ,JBPM_ID_MEMBERSHIP ,JBPM4_ID_USER 这三张表很常见,
基本的权限控制,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,
使用中有很多需求难以满足
除了前面述及的17张表外,还有一张引擎参数表,这是一张独立的表,在此没有单独列出
--------------------------------------------------------------------------
四,配置JBPM。
首先给出我的工程结构和spring配置。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:configure.properties</value> </list> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.query.substitutions">true=1,false=0</prop> <prop key="hibernate.jdbc.batch_size">25</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.generate_statistics">false</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.cache.region_prefix">direct</prop> <prop key="hibernate.cache.use_structured_entries">false</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheP rovider</prop> <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQuer yTranslatorFactory</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transacti on.JDBCTransactionFactory</prop> <!-- 自动创建表 --> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> </props> </property> <property name="dataSource" ref="dataSource"/> <property name="mappingLocations"> <list> <value>classpath:/org/first/config/LsyUser.hbm.xml</value> <value>classpath:/org/second/config/LsyDep.hbm.xml</value> </list> </property> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/> <property name="minPoolSize" value="${c3p0.minPoolSize}"/> <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/> <property name="maxStatements" value="${c3p0.maxStatements}"/> <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/> <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/> <property name="driverClass" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="transactionProxyTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="query*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 功能模块的引入 --> <import resource="classpath:/org/first/config/context_first.xml"/> <import resource="classpath:/org/second/config/context_second.xml"/> </beans>
# applicationContext.xml ### C3P0 Connection Pool c3p0.maxPoolSize=3 c3p0.minPoolSize=1 c3p0.maxIdleTime=1800 c3p0.maxStatements=0 c3p0.acquireIncrement=2 c3p0.idleConnectionTestPeriod=600 #oracle #jdbc.driverClassName=oracle.jdbc.driver.OracleDriver #jdbc.url=jdbc:oracle:thin:@10.55.15.66:1521:cdbank #jdbc.username=ccdb #jdbc.password=ccdb #hibernate.dialect=org.hibernate.dialect.Oracle9Dialect #mysql jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/mydb jdbc.username=root jdbc.password=root hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
<?xml version="1.0" encoding="UTF-8"?> <jbpm-configuration> <import resource="jbpm.default.cfg.xml" /> <import resource="jbpm.tx.spring.cfg.xml" /> <import resource="jbpm.jpdl.cfg.xml" /> <import resource="jbpm.bpmn.cfg.xml" /> <import resource="jbpm.identity.cfg.xml" /> <import resource="jbpm.businesscalendar.cfg.xml" /> <import resource="jbpm.console.cfg.xml" /> <import resource="jbpm.jobexecutor.cfg.xml" /> <process-engine-context> <string name="spring.cfg" value="applicationContext.xml" /> </process-engine-context> </jbpm-configuration>
2,修改spring的applicationContext.xml文件。
增加:
<!-- jbpm start --> <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" /> <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" /> <!-- jbpm end-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:jbpm.hibernate.cfg.xml" /> <property name="dataSource" ref="dataSource" /> </bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.query.substitutions">true=1,false=0</prop> <prop key="hibernate.jdbc.batch_size">25</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.generate_statistics">false</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.cache.region_prefix">direct</prop> <prop key="hibernate.cache.use_structured_entries">false</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> <!-- 自动创建表 --> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> </props> </property> <property name="dataSource" ref="dataSource"/> <property name="mappingLocations"> <list> <value>classpath:/org/first/config/LsyUser.hbm.xml</value> <value>classpath:/org/second/config/LsyDep.hbm.xml</value> <value>classpath:jbpm.repository.hbm.xml</value> <value>classpath:jbpm.execution.hbm.xml</value> <value>classpath:jbpm.history.hbm.xml</value> <value>classpath:jbpm.task.hbm.xml</value> <value>classpath:jbpm.identity.hbm.xml</value> </list> </property> </bean>
后面我将继续做一个测试模块来初步使用JBPM开发流程