`
hepx
  • 浏览: 149284 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JBPM学习心得

阅读更多

JBPM学习心得了解:
JBPM是一个开源的工作流项目,提供了丰富的API和可视化的流程开发工具,这使得开发起来变得简单灵活。
准备工作:
1.下载安装JBoss服务器。其实这一步可以用TOMCAT来取代的,那为什么要安装JBoss呢?下面有讲到。
       2.下载JBPM:jbpm-installer-3.3.1.jar这个不是最新版本考虑到稳定性的原因所以选择3.3.1版本。双击这个jar执行安装工作,在安装过程中有一步要指定一个JBoss服务器所以这里回答上面的疑问。我这里是以安装在D盘为准,安装好的目录如下:
       D:\jbpm-3.3.1.GA
              \config                  这是一个配置文件包含各种数据库和hibernate的配置等
              \database               这个文件下是创建各种JBPM数据库的执行脚本
              \designer               这个文件是myeclipse下的一个开发插件
              \doc                      这个是JBPM API
              \examples              这个是一个JBPM的例子
              \lib                        JBPM所用到的库文件
              \src                       JBPM的源码
       3.下载和安装JBPM开发插件。上面说到在\designer目录有一个插件可以找到在myeclipse当中安装即可。我们这里用下载的一个JBossTools-ALL-win32-3.0.1.GA.zip同样安装即可。安装好后我们可以看到如下所示表示安装成功。
JBPM学习心得 - hepanxi - hepanxi的博客
4.myeclipse当中配置JBPM的运行环境.找到myeclipse当中window下的首选项找到JBoss JBPM下的Runtimes localhosts在右边的列表当中添加刚刚我们安装的JBPM就可以了,如下图:
JBPM学习心得 - hepanxi - hepanxi的博客
这样我们的准备工作就其本完成。
 
开发JBPM项目:
当然这是在前面准备工作完成后才可以做的。
新建一个JBPM项目如图:
JBPM学习心得 - hepanxi - hepanxi的博客
       
新建好的目录如下所示:
JBPM学习心得 - hepanxi - hepanxi的博客
       src/main/java
目录下存放我们在流程各个节点的事件action、转向action、任务分配action等业务逻辑。
       src/main/config目录下存放的是我们的配置文件,其中得要的是hibernate.cfg.xml,在这个文件当中我们要配置我们的数据库信息。
       src/test/java此目录用来存放我们的单元测试代码。
       src/main/jpdl这个下面是我们编写的流程定义文件,由于JBPM提供可视化的开发工具所以在开发这个流程文件的时候非常简单。选中这个目录然后单击右键在弹出的选项当中选择新建在列表中选择其它然后选中JBPM节点下的process Definition。如下所示:
JBPM学习心得 - hepanxi - hepanxi的博客
JBPM学习心得 - hepanxi - hepanxi的博客
要开发一个好的流程,必须要对所有的节点的内容和作用非常清楚。在VSS7.0项目下有一个有关JBPM开发指南的PDF文档。这个里面写的很详细对我们了解JBPM有很好的帮助。我下面的例子也是借用此文档当中的例子加以改进的。
示例如下:

JBPM学习心得 - hepanxi - hepanxi的博客src/main/java中我新建了actiondecisiontask三个包,这三个包中分中放置事件action、转向action和任务分配action。记住JBPM为不同的动作提供了不同的实现提口。例如:普通的事件action 实现   ActionHandler接口,此接口只提供了一个方法,我们可以在这个方法当中写我们的业务。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
转向action 实现了 DecisionHandler 接口,此接口也只提供了一个方法。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
任务分配action 实现 AssignmentHandler 接口,此接口也只提供了一个方法。如下:
 
JBPM学习心得 - hepanxi - hepanxi的博客

完成后的整体结构如下所示:
JBPM学习心得 - hepanxi - hepanxi的博客  发布JBPM项目到数据库:
这里有两个方法可以实现。
方法一:
       我用的是MYSQL数据库。其它的数据库是一样的。只要支持hibernate的数据库都支持JBPM。因为JBPM与底层数据库交互采用的是hibernate。前面的准备工作当中有说到在安装目录的\database是创建各种JBPM数据库的执行脚本,所以这里只要找到MYSQL的执行脚本导入数据库就可以了。然后要在项目当中的hibernate.cfg.xml中配置我们的MYSQL数据库。
配置如下:

JBPM学习心得 - hepanxi - hepanxi的博客
在这个配置文件当中有一点要注意,如下:hibernate.hbm2ddl.auto属性默认的值是create表示重新生成所有表,这样程序每运行一次就会重新创建一次所有表而之前的数据就会丢失。为了避免这样的问题所以我们改成update就可以了。

JBPM学习心得 - hepanxi - hepanxi的博客
经过测试只要在数据库当中新建一个空的数据库。然后在上面的hibernate.cfg.xml配置文件当中hibernate.commecntion.url指定你刚建的数据库,hibernate.hbm2ddl.auto属性第一次运行程序采用默认值create,这样第一次运行程序就会自动创建JBPM所有的表,省掉了上面执行SQL脚本的步骤。当然运行完第一次后记得将hibernate.hbm2ddl.auto的值改成update
 
如果我们只需要手工编写代码来发布流程定义的话以上的工作就可以实现了。
发布代码如下:

JBPM学习心得 - hepanxi - hepanxi的博客
这样我们就把我们的流程发布到MYSQL数据库,我们可以打开MYSQL来检查一下是否发布成功。

JBPM学习心得 - hepanxi - hepanxi的博客
这里我重复发布了一次我的流程,所以在数据库当中有两个相同名字流程定义数据项。
疑问:我们在程序当中获得我们的流程定义也是通过名字找到的。那现在有两个一样名字的流程定义,那JBPM是怎么来找到我所要找的那个流程定义呢?
我们看到上面的表当中有一个VERSION_字段(版本),在第一次发布JBPM流程时这个VERSION_的值是1以后每发布一次这个JBPM VERSION_的值将加1。所以查找有相同名字的流程定义,JBPM就会默认找出最后一个版本流程返回。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
当然我们也可以找出指定版本的流程定义。如下:

JBPM学习心得 - hepanxi - hepanxi的博客 
方法二:
这个方法要相对于方法一复杂很多,要借用服务器和一个发布程序。这里我们用JBoss服务器说明。发布程序也不要我们去写,JBPM提供了这样的发布程序。记得我们在安装JBPM时有一步要指定一个JBoss服务器吗?指定这一步后在JBoss的安装目录\server\default\deploy\jbpm多出了一个jbpm目录,在这个目录当中就有JBPM提供的发布程序(jsf-console.war)。下面我们要对一些配置文件进行修改才可以运行JBoss和发布程序。
1.修改{jboss.home}\server\default\deploy\jbpm\jbpm-mysql-ds.xml配置如下(这里是我的配置):

JBPM学习心得 - hepanxi - hepanxi的博客
2.在表中插入以下数据。在这之前先要确定MYSQLJBPM表以创建。

JBPM学习心得 - hepanxi - hepanxi的博客
3. 配置jboss的认证管理。打开{jboss.home}/server/default/conf/login-config.xml文件,在文件中加入如下:

JBPM学习心得 - hepanxi - hepanxi的博客
4. 配置jboss-consoleweb.xml 使admin能登录进来。 打开${Jboss-Jbpm.hom}/jsf-console.war/WEB-INF/web.xml文件。在文件当中添加<role-name>admin</role-name>如下:

JBPM学习心得 - hepanxi - hepanxi的博客 
成功完成以上修改就可以启动JBoss了,然后在地址栏输入 http://localhost:8080/jbpm-console,admin/admin登录进去.
如下所示:已列出当前所有的流程信息:

JBPM学习心得 - hepanxi - hepanxi的博客
我们点击左边的Depoy a new process 就可以进入发布流程界面如下:

JBPM学习心得 - hepanxi - hepanxi的博客
这里我们要选择一个以*.jpdl结尾的文件进行发布。我们这里还没有这个文件,我们新建一个simple2.jpdl文件,然后到myeclipse下通过工具生成simple2.jpdl的文件内容。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
在发布界面选择上面生面的simple2.jpdl文件点击deploy按纽。流程就发布到数据库了。
如下所示:

JBPM学习心得 - hepanxi - hepanxi的博客 
运行JBPM
之前我们建的是一个JBPM project 项目只是用来开发和发布流程。而现在我们是要在JAVA web project当中来运行这个JBPMJBPM提供了丰富的API这使得我们可以在程序当中很容易的得到我们发布的流程以及可以通过我们自己的业务去灵活控制整个流程的走向。
首先我们新建一个JAVA web project 项目,要用到JBPM,当然要把JBPM的库文件加入到我们的项目当中来,还有MYSQL驱动包。然后把JBPM projectsrc/main/java/下的包和包下面的所有类等一同复制到JAVA web project当中的src即可。还有只要把JBPM project src/main/config下的hibernate.cfg.xml复制到JAVA web project当中。这样JBPM的所有文件已经成功迁移到JAVA web project 我们就可以在web project 当中使用JBPM了。
我简单写了几个JSPservlet测试了下这个流程。整个目录如下:
JBPM学习心得 - hepanxi - hepanxi的博客
我是把取得流程定义、生成流程实例、控制流程走向的业务都写在servlet当中处理的。前面有说到过JBPM提供了丰富的API供我们去调用和控制流程。下面就简单说下一些servlet的内容和作用。
1.从数据库找到我们发布的流程定义,并创建流程实例。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
2.任务委派(这个不是在servlet当中执行,是在task nodeaction当中执行的。这里主要是拿出来讲一下他的作用,使我们下面的讲解好理解)

JBPM学习心得 - hepanxi - hepanxi的博客
上面的任务只是委派了一上人manager.同样也可以委派给多个人的。代码如下:

JBPM学习心得 - hepanxi - hepanxi的博客
3.查找出当前用户所有等待的任务。下面是找出所有等待manager审批的任务:

JBPM学习心得 - hepanxi - hepanxi的博客
4.根据业务来控制流程的走向。如下:

JBPM学习心得 - hepanxi - hepanxi的博客
5.managerTakt.jsp页面如下:
JBPM学习心得 - hepanxi - hepanxi的博客
把程序发布到TOMCAT,然后启动TOMCAT进行测试:如下:
填写报销单界面:

JBPM学习心得 - hepanxi - hepanxi的博客
manager审批的界面:

JBPM学习心得 - hepanxi - hepanxi的博客
boss审批的界面:

JBPM学习心得 - hepanxi - hepanxi的博客
最后成功的页面:

JBPM学习心得 - hepanxi - hepanxi的博客
到这里程序运行就其本完成了。页面和业务都比较简单只是用来测试。这是最其本的东西,实际当中要复杂很多。
 
没有用到的节点
1.       fork(分支):一个fork把一个执行路线分割成多个执行路线。默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父母-子女关系。
2.       join(联合):默认联合(join)假设所有来自同一个父母的子令牌联合,当在上使用fork(分支)这个情形就出现了并且所有令牌分支建立,并且到达同一个联合(join)。当全部令牌都进入联合的时候联合就结束了, 然后联合将检查父母-子女, 当所有兄弟令牌到达联合(join),父母令牌将传播(唯一的)离开转换,当还有兄弟令牌活动时,联合的行为将作为等待状态。
3.       StateState节点也叫手工节点,进入到这种节点,整个流程的执行就会中断。直到系统外参与者发起继续执行的命令,即调用signalend方法,业务程序实例的执行才能够继续下去。其实这个节点可以替换task_node节点。task_node节点当中如果没有task的话其作用跟node节点一样不会等待而是一直执行下去。
 
留下的问题:
我的测试流程当中有一个sub_process的子流程。如图:
主流程:其中财务处理流程是一个子流程

JBPM学习心得 - hepanxi - hepanxi的博客
子流程:

JBPM学习心得 - hepanxi - hepanxi的博客
当程序每次执行到这个子流程时出现以下错误:

JBPM学习心得 - hepanxi - hepanxi的博客
上面的这个问题已经解决,问题出现在的原因是主、子流程之间没有建立关系导致错误的的出现。解决代码如下:

JBPM学习心得 - hepanxi - hepanxi的博客

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics