工作流--JBPM简介及开发环境搭建

一、 工作流简介

项目中不断的接触工作流,点点滴滴积累了一些,下面把一些学习到的东西整理记录下来。

工作流一般的适用场景:公文流转、行政审批、订单处理、产品研发、制造过程等。用专业一点的语言来描述工作流就是业务过程的部分或整体在计算机应用环境下的自动化,它主要解决的是使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现。针对这种特殊的业务实现的称之为工作流管理系统,此系统应提供三方面的支持:1.定义工作流(业务规则);2.运行控制功能(按照业务规则进行调度);3.运行交互(系统用户和工作流系统进行交互的功能)。为了快速和灵活开发相关工作流系统,出现了很多优秀的框架,有:JBPMOSWorkflowActiveBPEL等,下面要讲的就是JBPM

二、 JBPM主要概念

1. 流程定义:预先定义的业务流转逻辑

2. 流程实例:业务的一次实际流转过程 参与者:任务的执行者 活动(任务):组成流程定义的节点

3. 活动实例:组成流程实例的元素

4. 流转:从一个节点到另一个节点这一行为

5. 工作列表:当前需要办理的任务集合

6. 工作流引擎:工作流的核心组件,对流程实例、任务实例以及其状态进行管理

三、 JBPM模型说明

1. 流程定义:预先定义的业务流转逻辑

2. 流程实例:业务的一次实际流转过程

3. 参与者:任务的执行者

4. 活动(任务):组成流程定义的节点

5. 活动实例:组成流程实例的元素

6. 流转:从一个节点到另一个节点这一行为 工作列表:当前需要办理的任务集合

7. 工作流引擎:工作流的核心组件,对流程实例、任务实例以及其状态进行管理

四、 开发环境搭建

JBPM有很多版本,用过3.X4.4版本,总体感觉4.4更易用,下面以4.4版本为主,此为开源框架,因此免费,国内收费的还有普元的流程关系系统做的也不错,学习之初首先是配置搭建起一个开发环境:

1.   下载相关资源

a)    jBPM下载地址:http://sourceforge.net/projects/jbpm/files/

b)    eclipse版本稍微高一些,以免不兼容

2.   安装流程设计器(GPDEclipse插件)

a)    设计器eclipse提供界面操作,可通过界面操作形成流程定义文件,也就是上面我们说的业务规则;

b)    安装插件具体过程不再详解,所用到的插件包就在上面下载到的JBPM目录:JBPM_HOMEjbpm-4.4installsrcgpd下。

3.   Eclipse中添加JPDL4.4Schema校验

a)    Click Window --> Preferences

b)    Select XML --> XML Catalog

c)    选择 'Catalog Entry' ,点击FileSystem’

d)    添加Schema文件(xsd文件的路径为:JBPM_HOME/src/jpdl-4.4.xsd

4.   创建一个Helloworld示例

a)    src下创建JBPM4 ProcessDefinition文件,命名为hello,会生成hello.jpdl.xml文件;

b)    添加依赖库

                           i.         JBPM_HOME/jbpm.jar(核心包)

                         ii.         JBPM_HOME/lib/*.jar,不添加以下jar包:servlet-api.jar,junit.jar。其中junit.jar一定不要添加,因为是3.8.2版本,与我们使用的junit4有冲突

                        iii.         所使用的数据库对应的驱动的jar包(第2步所添加的jar包中已包含mysqljdbc驱动jar包)。

c)    添加并定义JBPM必须的配置文件

                           i.         配置文件可以从JBPM_HOME/examples/src/中拷贝:

jbpm.cfg.xmllogging.propertiesjbpm.hibernate.cfg.xml

                         ii.         修改logging.properties中的日志输出级别为WARNINGjava.util.logging.ConsoleHandler.level=WARNING

                        iii.         修改jbpm.hibernate.cfg.xml中的数据库连接信息。如果使用MySQL,使用的方言一定要是org.hibernate.dialect.MySQL5InnoDBDialect

                        iv.         数据库连接编码一定要是UTF-8。否则可能会在部署含有中文字符的流程定义时会抛异常,说sql语法错误。

d)    环境已经配置完毕,下面就是在hello.jpdl.xml进行设计了,具体内容如下:

 

01.<?xml version="1.0" encoding="UTF-8"?>    
02.<process name="helloworld" xmlns="http://jbpm.org/4.4/jpdl">    
03.   <start g="230,25,114,64" name="start1">    
04.      <transition g="-59,-17" name="to state1" to="中国"/>    
05.   </start>    
06.   <end g="168,333,80,51" name="end1"/>    
07.   <state g="206,194,62,63" name="中国">    
08.      <transition g="-47,-17" name="to end1" to="end1"/>    
09.   </state>    
10.</process>  

e)    下面就要在利用JUNIT创建一个流程定义测试类,如下

 

01.package com.test;             
02.import java.util.List;     
03.import junit.framework.TestCase;        
04.import org.jbpm.api.Configuration;        
05.import org.jbpm.api.ProcessDefinition;        
06.import org.jbpm.api.ProcessEngine;     
07.import org.jbpm.api.RepositoryService;     
08.    
09.public class HelloTest extends TestCase {     
10.         
11.    //----发布流程定义     
12.    //第一步:启动流程引擎     
13.    ProcessEngine engine;     
14.    public HelloTest(){     
15.        engine=Configuration.getProcessEngine();     
16.    }     
17.    //测试发布     
18.    public void testDeploy(){     
19.        //获取流程服务     
20.        RepositoryService service=engine.getRepositoryService();     
21.        //把流程定义发布到流程引擎中     
22.    String developementId=service.createDeployment()     
23.                              .addResourceFromClasspath("helloworld.jpdl.xml").deploy();     
24.             
25.             
26.        //----查看流程定义     
27.        //发布流程定义信息,查看已发布流程定义列表     
28.        List<ProcessDefinition> definitions=service.createProcessDefinitionQuery().list();//执行搜索     
29.        for (ProcessDefinition processDefinition : definitions) {     
30.            System.out.println(processDefinition.getId());     
31.    }     
32.             
33.        //----删除流程定义,这里用级联删除会比较好     
34.        service.deleteDeploymentCascade(developementId);     
35.             
36.        //查看输出后流程定义的个数     
37.        System.out.println(service.createProcessDefinitionQuery().list().size());     
38.             
39.    }     
40.}   

f)     然后利用JUNIT创建一个流程实例测试,如下:

 

01.import java.util.List;     
02.    
03.import junit.framework.TestCase;     
04.    
05.import org.jbpm.api.Configuration;     
06.import org.jbpm.api.ExecutionService;     
07.import org.jbpm.api.ProcessEngine;     
08.import org.jbpm.api.ProcessInstance;     
09.    
10.public class ProcessInstanceTest extends TestCase {     
11.    //----发布流程定义     
12.    //第一步:启动流程引擎     
13.    ProcessEngine engine;     
14.    public ProcessInstanceTest(){     
15.        engine=Configuration.getProcessEngine();     
16.    }     
17.    protected void setUp(){     
18.        engine.getRepositoryService().createDeployment()     
19.        .addResourceFromClasspath("helloworld.jpdl.xml").deploy();     
20.    }     
21.         
22.    public void testProcessInstance(){     
23.        //这个是专门管理流程实例的     
24.        ExecutionService executionService=engine.getExecutionService();     
25.        //通过流程定义文件的名称当做KEY来获取流程实例;也就是发布新流程     
26.        ProcessInstance processInstance=executionService.startProcessInstanceByKey("helloworld");     
27.        System.out.println(processInstance);     
28.             
29.        //这里输出流程实例是否结束,针对本实例来说肯定是FALSE,因为本实例中有STATE,所以会在STATE这里处理等待状态,不会结束      
30.        //也就是接下来要说的执行等待的流程,除非你调用executionService.signalExecutionById     
31.        System.out.println(processInstance.isEnded());     
32.             
33.        //这个方法将是处理等待转该的流程执行到结束,返回值热仍然是一个流程实例     
34.        processInstance=executionService.signalExecutionById(processInstance.getId());     
35.        System.out.println(processInstance.isEnded());     
36.    }     
37.    public void testDeleteProcessInstance(){     
38.        ExecutionService executionService=engine.getExecutionService();     
39.        ProcessInstance processInstance=executionService.startProcessInstanceByKey("helloworld");     
40.        executionService.deleteProcessInstanceCascade(processInstance.getId());     
41.             
42.    }     
43.         
44.    public void testProcessInastanceList(){     
45.      ExecutionService executionService=engine.getExecutionService();     
46.      ProcessInstance pi=executionService.startProcessInstanceByKey("helloworld");     
47.      ProcessInstance pi1=executionService.startProcessInstanceByKey("helloworld");     
48.      List<ProcessInstance> pis=executionService.createProcessInstanceQuery().list();     
49.      for (ProcessInstance processInstance : pis) {     
50.        System.out.println(processInstance);     
51.    }     
52.    }     
53.}     


    以上就是一个简单的测试小程序,通过这个小实例来宏观的认识一下JBPM

原文地址:https://www.cnblogs.com/jiangu66/p/3165727.html