JBPM学习(一)--与SSH整合


学习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就是插入测试数据的脚本

JBPM学习(一)--与SSH整合
从上面的图片可以看出有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配置。

JBPM学习(一)--与SSH整合
applicationContext.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"
    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>

configure.properties

# 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

现在开始修改配置。
1,在源文件夹中增加jbpm.cfg.xml配置文件,内容如下:

<?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>

这个可以在jbpm-4.4\install\src\cfg\jbpm路径下找到spring.jbpm.cfg.xml。
这个文件中就是上面的内容。


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-->

上面是参照jbpm-4.4\install\src\cfg\spring下的applicationContext.xml文件。
注意和里面有些区别,里面有关于sessionFactory的配置如下;

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:jbpm.hibernate.cfg.xml" />
    <property name="dataSource" ref="dataSource" />
  </bean>

就是说,sessionFactory的配置它又单独放到classpath:jbpm.hibernate.cfg.xml中了。
我们可以这么做,单我习惯使用properties文件配置(如上)。
这个jbpm.hibernate.cfg.xml其实就是我们配置hibernate的文件,
在jbpm-4.4\install\src\cfg\hibernate下也给我们提供了很多模板,我们根据是否使用spring以及配置数据源的方式到里面找模板拷贝里面的配置并改成自己的就行了。


在这里要注意,索然我们使用properties文件配置sessionFactory,对比给出的模板还是把
<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />
上面5个xxx.hbm.xml一定要引入到Hibernate中,这些文件已经在jar包中了,我们只要在配置sessionFactory
时引入即可:


	<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开发流程




你可能感兴趣的:(jbpm)