小树不倒我不倒 2009-06-01
jBPM,全称是JavaBusinessProcessManagement,是一种基于J2EE的轻量级工作流管理系统。jBPM是公开源代码项目,遵循ApacheLicense。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBossjBPM。
jBPM有两大特色,使他成为市场的一大两点。其中最大的特色就是它的业务逻辑定义没有采用目前的一些规范,如WfMC´sXPDL,BPML,ebXML,BPEL4WS等,而是它自己定义的JBossjBPMProcessdefinitionlanguage(jPdl)。jPdl把一个业务逻辑流程看作是一个UML状态图,如果你不熟悉UML状态图,那初学计算机语言的流程图应该熟悉吧,表达的方式和意思大同小异。jPdl详细定义了这个状态图的每个部分,如起始、结束状态,状态之间的转换等;其另一大特色就是集成Hibernate,确切的说是绑定,使用Hibernate来管理数据库,这样jBPM只专注于他的业务流程控制。
从上面可以看出,jBPM是一个业务流程管理引擎,是一个工作流引擎。除此之外,它同时实现了对jPDL和对BPEL的支持。它整合了Hibernate技术处理数据库,创建了一系列的数据库表,持久化工作流引擎所需的状态。因此,jBPM支持所有Hibernate支持的数据库,能够把Java对象持久化到数据库中,把Hibernate支持的Java类的对象保存到数据库中!
你完全可以像用Java的类库一样使用JBossjBPM,而且通过配置JBossjBPM也可以被部署在其它J2EE应用服务器上和任何数据库上。
在本文中,我们首先来创建我们的JBossjBPM运行开发环境。在开始之前,请准备一下软件产品:
·JDK1.5或者更高版本,这里使用JDK6u10b
·ApacheTomcat5.5.x或更高版本,这里使用Tomcat6.0.16
·MySQL5.1,也可以选择其它Hiberante支持的数据库,没有太大差别,这里使用MySQL5.1
·ApacheAnt1.7.0
·JBPM-3.2.3
·EclipseEuropa(EclipseV3.3)forJavaEEDevelopers或更高,这里使用EclipseV3.4
说明:JBossjBPM的发布包中已经配置好了一套服务环境,是基于JBoss的。因为我们习惯了Tomcat的小巧灵活,而且我们也不希望jBPM依赖JBoss。
1.下载安装JDK,Tomcat,Ant,MySQL,并设置相应的环境变量
此步骤不再熬述,具体请查阅官方文档
Jdk:http://java.sun.com/
Ant:http://ant.apache.org/
Tomcat:http://tomcat.apache.org/
Eclipse:http://www.eclipse.org/
2.下载JBossjBPM
JBossjBPM官方(http://www.jboss.org/jbossjbpm/)当前发布的版本为3.2.3,只需要下载jPDLSuite,下载后得到jbpm-jpdl-suite-3.2.3.zip,这个套件包含了所有的内容和资源,包括eclipse插件,示例,和流程管理控制应用。
解压jbpm-jpdl-suite-3.2.3.zip,这里解压后得到D:\jbpm-jpdl-3.2.3,其主要目录结构如下:
D:\jbpm-jpdl-3.2.3
|---db这里都是些sql定义和数据文件,如果改用其它数据库,可以使用这些资源来创建,服务还是很周到的。顺便
|罗嗦一句,jBPM默认使用的是内存数据库hsqldb,这个数据库还没研究过(嘿嘿---)
|
|---deploy用来部署你的应用的包和资源
|
|---designer这里是Eclipse插件,这样你就可以在图形界面来定义你的业务流程,骨灰级人物没他也能过日子
|
|---doc这里是jBPM相关组件的API文档
|
|---examples这里是些学习的例子
|
|---libjBPM的类库
|
|---server这里有一个JBoss服务器,并且包含了本JBossjBPM引擎,还部署了websale例子
|
|---src这里是JBossjBPM的源代码
3.配置数据库
jBPM需要把初始化数据和工作流定义存储到数据库中,它定义了一套数据结构来存储这些数据,这也是该容器本身的特点。
在mysql中创建一个数据库jbpm,(createdatabasejbpm;),并创建用户jbossjbpm(密码:jbossjbpm)
说明:如果你嫌麻烦可以使用root账号和其密码,不过下面的设置请做相应的更改
在D:\jbpm-jpdl-3.2.3\db找到jbpm.jpdl.mysql.sql,该文件必须修改一下,以符合MySQL的语法结构。具体就是在每条语句的末尾增加一个分号";"你可以借助UltrEdit,EditPlus等工具来做这些事情(注意替换时要注意匹配大小写,有写表的字段中包含CREATE字符),如果是第一次创建这些数据库表,要删除create语句上面的alter和drop(这些表还都不存在)。
4.准备jBPM包
这是个jbpm-jpdl流程管理控制台,就像Tomcat有个单独的Administrator应用用来管理配置和部署一样的东东。有了他你可以在图形界面来操作控制你的应用。
打开命令行控制台,切换到D:\jbpm-jpdl-3.2.3\deploy目录,执行以下命令:
antcustomize.console.for.tomcat
注意:请确保你的ant安装配置妥当,可以在命令行输入:ant-version来检测ant是否正确安装。命令执行后能看到ant的版本信息即OK
antcustomize.console.for.tomcat执行成功后,会在D:\jbpm-jpdl-3.2.3\deploy目录下生成customized和target目录,其中customized目录下的jbpm-console.war即是我们想要的war包。
我们需要修改jbpm-console.war/WEB-INF/classes/hibernate.cfg.xml文件,以适应我们的资源属性的需要。修改后的结果如下:
Xml代码
<hibernate-configuration>
<session-factory>
<!--hibernatedialect-->
<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!--JDBCconnectionproperties(begin)-->
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property>
<propertyname="hibernate.connection.username">jbossjbpm</property>
<propertyname="hibernate.connection.password">jbossjbpm</property>
<!--JDBCconnectionproperties(end)-->
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!--DataSourceproperties(begin)==
<propertyname="hibernate.connection.datasource">java:/JbpmDS</property>
==DataSourceproperties(end)-->
<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
...
<hibernate-configuration>
<session-factory>
<!--hibernatedialect-->
<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!--JDBCconnectionproperties(begin)-->
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property>
<propertyname="hibernate.connection.username">jbossjbpm</property>
<propertyname="hibernate.connection.password">jbossjbpm</property>
<!--JDBCconnectionproperties(end)-->
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!--DataSourceproperties(begin)==
<propertyname="hibernate.connection.datasource">java:/JbpmDS</property>
==DataSourceproperties(end)-->
<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
...
这里就是启用了更换了默认的数据属性,JDBCconnectionproperties,还有自己定义的数据名字和帐号,另外需要注意的是用
Xml代码
<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
代替JTATransactionFactory和CMTTransactionFactory,想用JTATransactionFactory或CMTTransactionFactory配置也可以,不过还没有研究过,有知道的朋友可以一起学习一下。
拷贝jboss-j2ee.jar包至jbpm-console.war/WEB-INF/lib。发布包下(D:\jbpm-jpdl-3.2.3)很多地方都有这个包你可以找一下,比如D:\jbpm-jpdl-3.2.3\server\client。
这里主要是用到了JavaTransactionArchitecture,所以你可以用J2EE中的jta.jar包还替换jboss-j2ee.jar。jta相关信息请参考:http://java.sun.com/javaee/technologies/jta/index.jsp
拷贝commons-collections.jar包至jbpm-console.war/WEB-INF/lib。发布包下(D:\jbpm-jpdl-3.2.3)好几处都有这个包,比如D:\jbpm-jpdl-3.2.3\server\server\jbpm\lib。这个包是ApacheCommons包,到处都找的的到。
拷贝jsf-api.jar和jsf-impl.jar包至jbpm-console.war/WEB-INF/lib,你可以在D:\jbpm-jpdl-3.2.3\server\server\jbpm\deploy\jboss-web.deployer\jsf-libs种找到这两个包。
说明:因为jbpm-console是一个jsf应用,没这两个包,你访问时会报404或505错误。
拷贝MySQLJDBC驱动程序包至%CATALINA_HOME%/lib(Tomcat6)或%CATALINA_HOME%/common/lib(Tomcat5.5)
拷贝修改后的jbpm-console至%CATALINA_HOME%/webapps
这样jBPM基本上配置完成,但是我们还不能访问他,还需要配置安全访问控制和初始的用户数据
5.配置Tomcat安全域
方法一:在%CATALINA_HOME%/conf/Catalina/localhost创建一个jbpm-console.xml文件,内容如下:
Xml代码
<Context>
<Realmclassname="org.apache.catalina.realm.JDBCRealm"
drivername="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/jbpm"
connectionname="jbossjbpm"
connectionPassword="jbossjbpm"
userTable="JBPM_ID_USERu,JBPM_ID_MEMBERSHIPm,JBPM_ID_GROUPg"
userNameCol="g.TYPE_='security-role'ANDm.GROUP_=g.ID_ANDm.USER_=u.ID_ANDu.NAME_"
userCredCol="DISTINCTu.PASSWORD_"
userRoleTable="JBPM_ID_USERu,JBPM_ID_MEMBERSHIPm,JBPM_ID_GROUPg"
roleNameCol="g.NAME_"/>
</Context>
<Context>
<Realmclassname="org.apache.catalina.realm.JDBCRealm"
drivername="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/jbpm"
connectionname="jbossjbpm"
connectionPassword="jbossjbpm"
userTable="JBPM_ID_USERu,JBPM_ID_MEMBERSHIPm,JBPM_ID_GROUPg"
userNameCol="g.TYPE_='security-role'ANDm.GROUP_=g.ID_ANDm.USER_=u.ID_ANDu.NAME_"
userCredCol="DISTINCTu.PASSWORD_"
userRoleTable="JBPM_ID_USERu,JBPM_ID_MEMBERSHIPm,JBPM_ID_GROUPg"
roleNameCol="g.NAME_"/>
</Context>
方法二:修改%CATALINA_HOME%/conf/tomcat-users.xml文件来设置安全域。为了不和tomcat已有的用户冲突,这里把tomcat以前的登陆帐号username="admin"修改为username="tadmin",修改后的文件如下:
Xml代码
<?xmlversion='1.0'encoding='utf-8'?>
<tomcat-users>
<rolerolename="user"/>
<rolerolename="administrator"/>
<rolerolename="manager"/>
<rolerolename="sales"/>
<rolerolename="hr"/>
<rolerolename="admin"/>
<rolerolename="participant"/>
<userusername="user"password="user"roles="user,sales"/>
<userusername="shipper"password="shipper"roles="user,hr"/>
<userusername="manager"password="manager"roles="admin,hr,manager,user,sales"/>
<userusername="tadmin"password=""roles="admin,manager"/>
<userusername="admin"password="admin"roles="admin,user,hr"/>
</tomcat-users>
<?xmlversion='1.0'encoding='utf-8'?>
<tomcat-users>
<rolerolename="user"/>
<rolerolename="administrator"/>
<rolerolename="manager"/>
<rolerolename="sales"/>
<rolerolename="hr"/>
<rolerolename="admin"/>
<rolerolename="participant"/>
<userusername="user"password="user"roles="user,sales"/>
<userusername="shipper"password="shipper"roles="user,hr"/>
<userusername="manager"password="manager"roles="admin,hr,manager,user,sales"/>
<userusername="tadmin"password=""roles="admin,manager"/>
<userusername="admin"password="admin"roles="admin,user,hr"/>
</tomcat-users>
6.初始化数据
在MySQLjbpm数据库中插入以下数据
Sql代码
INSERTINTOJBPM_ID_GROUPVALUES(1,'G','sales','organisation',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(2,'G','admin','security-role',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(3,'G','user','security-role',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(4,'G','hr','organisation',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(5,'G','manager','security-role',NULL);
INSERTINTOJBPM_ID_USERVALUES(1,'U','user','[email protected]','user');
INSERTINTOJBPM_ID_USERVALUES(2,'U','manager','[email protected]','manager');
INSERTINTOJBPM_ID_USERVALUES(3,'U','admin','[email protected]','admin');
INSERTINTOJBPM_ID_USERVALUES(4,'U','shipper','[email protected]','shipper');
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(1,'M',NULL,NULL,2,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(2,'M',NULL,NULL,3,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(3,'M',NULL,NULL,4,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(4,'M',NULL,NULL,4,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(5,'M',NULL,NULL,1,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(6,'M',NULL,NULL,2,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(7,'M',NULL,NULL,3,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(8,'M',NULL,NULL,3,2);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(9,'M',NULL,NULL,2,2);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(10,'M',NULL,NULL,2,5);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(11,'M',NULL,'boss',2,1);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(12,'M',NULL,NULL,1,1);
INSERTINTOJBPM_ID_GROUPVALUES(1,'G','sales','organisation',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(2,'G','admin','security-role',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(3,'G','user','security-role',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(4,'G','hr','organisation',NULL);
INSERTINTOJBPM_ID_GROUPVALUES(5,'G','manager','security-role',NULL);
INSERTINTOJBPM_ID_USERVALUES(1,'U','user','[email protected]','user');
INSERTINTOJBPM_ID_USERVALUES(2,'U','manager','[email protected]','manager');
INSERTINTOJBPM_ID_USERVALUES(3,'U','admin','[email protected]','admin');
INSERTINTOJBPM_ID_USERVALUES(4,'U','shipper','[email protected]','shipper');
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(1,'M',NULL,NULL,2,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(2,'M',NULL,NULL,3,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(3,'M',NULL,NULL,4,4);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(4,'M',NULL,NULL,4,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(5,'M',NULL,NULL,1,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(6,'M',NULL,NULL,2,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(7,'M',NULL,NULL,3,3);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(8,'M',NULL,NULL,3,2);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(9,'M',NULL,NULL,2,2);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(10,'M',NULL,NULL,2,5);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(11,'M',NULL,'boss',2,1);
INSERTINTOJBPM_ID_MEMBERSHIPVALUES(12,'M',NULL,NULL,1,1);
7.启动Tomcat服务,查看控制台的日志,排除错误,数据库错误和支持库不完整都可能导致错误。
在浏览器中输入:http://localhost:8080/jbpm能正常访问说明部署成功,你可以用页面上列出的用户和账号登陆进去体验一下。