工作流(jBPM) - 学习笔记(二)- jBPM持久化-- 数据库表的创建
前言:有了第一节的介绍之后,对于工作流,应该大致有个印象了,这一节主要说一说jBPM流程引擎的数据库初始化。
前一节,我们通过helloworld的例子已经对jbpm如何对流程进行引擎有了初步的了解,试想一下,jbpm每创建一个流程实例,实例都是有状态的,比如在突发情况下,系统故障,那么流程数据就会丢失,这是我们不希望看到的,这时,我们就需要对流程实例数据进行持久化。
那么jBPM的持久化是怎么做的呢?答案也许跟你想的一样,对,是数据库。jbpm采用的是数据库来持久化,并且访问数据库的框架用的是比较流行的hibernate,需要在数据库持久化这些数据。首先需要的就是数据库表,我们如何创建这些表呢,jbpm为我们提供了三种方式来创建数据库表:
(1)直接运行脚本法:
在jbpm 3.2版本之后,所提供的包内容有所不同,我们可以在官网上下载到jbpm-jpdl-suite-xxx.zip这样的一个包,解压之后,里面有一个目录db,打开这个目录,下面有一系列针对不同数据库的sql文件,我们可以针对使用的数据库,来选择相应的脚本来执行,创建我们的持久化表。
如数据库采用的是mysql,那么我们就选择 jbpm.jpdl.mysql.sql 文件中的脚本来执行,此sql脚本分为三部分:删除各表之间的外键依赖、删除表、创建表及外键索引。
(2)编码方式:
这一种方式其实就两句代码,但是为了更清楚点,我使用eclipse重新创建了一个工程,而没有选择在第一节中导入的那个jbpm项目中进行编码。
1、创建工程CreateJbpmSchema,导入依赖包(经测试):
jbpm\build\
jbpm-3.1.4.jar、jbpm-identity-3.1.4.jar
jbpm\lib\dom4j\
dom4j-1.6.1.jar
jbpm\lib\jboss\
commons-collections.jar、commons-logging.jar、bsh-1.3.0.jar、antlr-2.7.5H3.jar、log4j.jar、cglib-2.1_2jboss.jar
jbpm\lib\hibernate\
hibernate3.jar、jta.jar
不要忘记导入数据库驱动。
将上一节工程src/config.files目录下面的hibernate.cfg.xml、jbpm.cfg.xml、log4j.properties三个配置文件拷贝到classpath目录下。在这里要记得更改hibernate.cfg.xml中的数据库链接信息,比如:
<!-- jdbc connection properties -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpmtest</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mysql</property>
2、环境创建好之后,就可以进行编码了,代码如下:
testCreateSchema
1 //加载jbpm的配置文件:默认加载 2 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); 3 4 //创建表: 5 jbpmConfiguration.createSchema();
3、JbpmConfiguration.getInstance();会加载默认的配置文件,这里注意一下,我们的classpath目录下的jbpm.cfg.xml的内容中的标签jbpm-configuration下面为空、那么jbpm如果加载到这样一个内容为空的配置文件时,就会去加载jar包中的org.jbpm包下的default.jbpm.cfg.xml文件,此例中就是这种情况。
jbpmConfiguration.createSchema();这一句就会去调用hibernate的表生成工具来创建表,及表关联。
4、到此为止,我们的数据库中的表已经创建好了,不过,我们如果看控制台的话,就是发现有一系列的警告错误:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
...
CGLIB Enhancement failed: org.jbpm.graph.exe.ProcessInstance
等等一系列的错误,这是由于引入的jar包兼容性问题,我不知道为何jbpm发布的包中会出现这种问题,处理办法,本人的机子里面有一个hibernate-3.2.6.ga的下载包,于是,将工程中的cglib、hibernate包删除(即上面描红的包,上面的hibernate包为3.1版本),导入了本机上的hibernate3.jar(小版本为3.2.6),以及hibernate下载包中的hibernate-3.2\lib\cglib-2.1.3.ja包,还有两个包也是需要导入的:
jbpm\lib\jboss\
asm.jar、asm-attrs.jar -- 是处理java字节数据的包。
做了这些操作之后,再运行就不会报错了。谈到此的目的是想说,在我们平常java开发中,我们会用到许多第三方的jar包,这时候兼容性就要注意了。
(3)使用ant工具
ant 工具的语法,本人也是略知,在这里也不做多的讲解。本例使用ant来初始化数据库的表创建,跟上一个例子一样,同样不在jbpm的原有包上面进行修改,具体步骤如下:
1、在任何可用目录下面创建目录jbpmcreateschema(此目录名字随便,后面称为home目录),在此目录下面创建子目录config、lib,然后将(2)工程中使用到的所有jar包拷贝到lib目录下,将src\config.files\hibernate.cfg.xml、src\resources\hsqldb\create.db.hibernate.properties两个文件拷贝到config目录下。
2、修改create.db.hibernate.properties里面的属性值:
hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/jbpmtest hibernate.connection.username=root hibernate.connection.password=mysql hibernate.show_sql=true
注:此处只需要修改hibernate.cfg.xml和create.db.hibernate.properties中的一个数据库链接信息就可以了,可以看源码得知。
3、在${home}目录下创建build.xml文件(ant工具配置文件),文件内容如下:
<project name="jbpm.deploy" basedir="." default="create.db"> <target name="create.db" depends="declare.jbpm.tasks" > <jbpmschema actions="create" cfg="${basedir}/config/hibernate.cfg.xml" properties="${basedir}/config/create.db.hibernate.properties"/> </target> <target name="declare.jbpm.tasks"> <taskdef name="jbpmschema" classname="org.jbpm.ant.JbpmSchemaTask"> <classpath> <fileset dir="${basedir}/lib"> <include name="**/*.jar"/> </fileset> </classpath> </taskdef> </target> </project>
此配置文件,任务类为org.jbpm.ant.JbpmSchemaTask。
4、执行。commad模式,进行入${home},执行命令ant(需要机子配置好ant工具,可以去apache的官网看下ant用法),会看到一系列的日志,显示创建表,最后会有执行成功的日志。这时候查看数据库就可以看到表已经创建好了。
好了,到此为止,jbpm的数据库表已经创建好了,如有疑问请留言,或者邮箱。

浙公网安备 33010602011771号