JBPM4.4:入门

1.     工作流基础

1.1. 工作流相关概念

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

工作流管理系统(WfMS,Workflow Management System)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:

1.  定义工作流:包括具体的活动、规则等

2.  运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度

3.  运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。

采用工作流管理系统的优点

1. 提高系统的柔性,适应业务流程的变化 

2. 实现更好的业务过程控制,提高顾客服务质量

3. 降低系统开发和维护成本

工作流框架有:Jbpm、OSWorkflow、ActiveBPEL、YAWL等

OA(办公自动化)主要技术之一就是工作流。

引入办公系统中存在很多流程,他们具备以下共同点:

1,存储数据

2,有状态

流程一:2个环节 --变化--> 4个环节 --变化--> 8个环节 --> 6个环节

流程二:3个环节

流程n :m个环节


流程开发中存在一些问题:

流程比较多,管理比较混乱

流程环节可能会变化


目标:

    不改程序

    即程序中支持用户定制流程与申请模板(用户)

    要有方便好用用户界面。

 

方案:

    通过上传下载实现定制模板。

    用画图的方式定制流程。

   

实现:

    ?画图程序怎么做(Swing/AWT+Applet,Flex)

    ?制定一个什么样的流程规则

    ?按规则解析与执行流程

===> 工作流框架 / 工作流管理系统

    需要用户定流程的情况(流程多、变化)

1.2. 开源工作流jBPM4.4介绍

jBPM 即java Business Process Management,是基于java的业务流程管理系统。jBPM是市面上相当流行的一款开源工作流引擎,引擎底层基于Active Diagram模型。jBPM4.4使用了hibernate(3.3.1版),因此可以很好的支持主流数据库。jBPM4.4共有18张表。

jBPM官方主页:http://www.jboss.org/jbpm

 

2.     准备jBPM4.4环境

2.1.  jBPM4.4所需环境

jBPM requires a JDK (standard java) version5 or higher. http://java.sun.com/javase/downloads/index.jsp

To execute the ant scripts, you'll needapache ant version 1.7.0 or higher: http://ant.apache.org/bindownload.cgi

2.2. 下载相关资源

1, jBPM下载地址:http://sourceforge.net/projects/jbpm/files/

2, Eclipse下载地址( Eclipse IDE for Java EE Developers (163 MB),Version:3.5 ):http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo

2.3. 安装流程设计器(GPD,Eclipse插件)

GPDGraphical Process Designer)是一个Eclipse插件。

安装方法说明(jBPM4.4UserGuide, 2.11.2. Install the GPD plugin into eclipse):

*  Help --> Install New Software...

*  Click Add...

*  In dialog Add Site dialog, click Archive...

*  Navigate to install/src/gpd/jbpm-gpd-site.zip and click 'Open'

*  Clicking OK in the Add Site dialog will bring you back to the dialog 'Install'

*  Select the jPDL 4 GPD Update Site that has appeared

*  Click Next... and then Finish

*  Approve the license

*  Restart eclipse when that is asked

查看是否成功安装了插件:WindowàPreference中是否有Jboss jBPM项。

2.4. 在Eclipse中添加jPDL4.4 Schema校验

流程定义文件的xsd文件的路径为:JBPM_HOME/src/jpdl-4.4.xsd。

添加到Eclipse中的方法为(jBPM4.4User Guide, 2.11.5. Adding jPDL 4 schema tothe catalog):

*  Click Window --> Preferences

*  Select XML --> XML Catalog

*  Click 'Add...'

*  The 'Add XML Catalog Entry' dialog opens

*  Click the button with the map-icon next to location and select 'FileSystem...'

*  In the dialog that opens, select file jpdl-4.4.xsd in the src directoryof the jBPM installation root.

*  Click 'Open' and close all the dialogs

 

/**

     * 保存为流程定义文档(.zip),其中至少有两个文件:processdefinition.jpdl.xmlprocessimage.png

ZipOutputStream的使用

     * @param path

     */

    public voidsaveProcessArchive(ExecutionContext ec, String path) {

        ZipOutputStream zipOut =null;

        try {

            zipOut = new ZipOutputStream(newFileOutputStream(path));

 

            // 1,保存流程定义文件: process.jpdl.xml

            zipOut.putNextEntry(newZipEntry("process.jpdl.xml"));

           zipOut.write(getProcessDefinitionXml(ec).getBytes("utf-8"));

 

            // 2,保存流程图片: processimage.png

            zipOut.putNextEntry(newZipEntry("process.png"));

           zipOut.write(getProcessImageData(ec));

 

        } catch (Exception ex) {

            throw newRuntimeException(ex);

        } finally {

            if (zipOut != null) {

                try {

                    zipOut.close();

                } catch (IOExceptionex) {

                    throw newRuntimeException(ex);

                }

            }

        }

    }

JBPM的结构和原理

JBPM4.4:入门_第1张图片

管理流程(流程定义)

    部署(添加)

查询

    删除

    查看流程图(xxx.png

    -- 修改 --没有真正的修改,而是使用“再次部署+使用最新版本启动流程实例”的方式代替。这是因为流程实例是依赖你的流程定义的环节的,要保存历史记录。

 

 

执行流程

    启动流程实例

    查询任务列表

    办理任务

    向后执行一步

 

 

2.5. 准备jBPM4.4的开发环境

2.5.1.  添加jBPM4.4的jar包

1.  ${JBPM_HOME}/jbpm.jar(核心包)

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

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

2.5.2.  添加并定制配置文件

1.  配置文件可以从JBPM_HOME/examples/src/中拷贝:
jbpm.cfg.xml、
logging.properties、//要注意版本的问题,接口和实现类要相同版本
jbpm.hibernate.cfg.xml。

2.  修改logging.properties中的日志输出级别[t1] 为WARNING:java.util.logging.ConsoleHandler.level=WARNING

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

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

 

 

说明:如果要改变jbpm.hibernate.cfg.xml的文件名称,需要做:

1、从JBPM_HOME/src/中拷贝jbpm.tx.hibernate.cfg.xml放到工程的src/下,然后进行修改。

2、修改jbpm.tx.hibernate.cfg.xml中的hibernate主配置文件的路径配置(指定的是相对于classpath的相对路径)。

 

2.5.3.  初始化数据库

1, 方法一:执行sql脚本文件${JBPM4.4_HOME}/install/src/db/create/jbpm.*.create.sql

2, 方法二:使用Hibernate的自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。

注意流程设计器的图片生成法和zip生成文件

搞清楚hellowoeld程序,就是在下面这个程序的基础上添加一层web页面,搞明白他

Helloworld

public class HelloWorld_API {

 

    // 建表

    @Test

    public void createSchema() throwsException { // hbm2ddl.auto=update

        neworg.hibernate.cfg.Configuration()//

                .configure("jbpm.hibernate.cfg.xml")//

                .buildSessionFactory();

    }

 

    private static ProcessEngineprocessEngine = new Configuration()//

            .setResource("jbpm.cfg.xml")//

            .buildProcessEngine();

 

    // 1,部署流程定义

    @Test

    public voiddeployProcessDefintion() throws Exception {

        processEngine.getRepositoryService()//

                .createDeployment()//

                .addResourceFromClasspath("helloworld/helloworld.jpdl.xml")//

                .addResourceFromClasspath("helloworld/helloworld.png")//

                .deploy();

    }

 

    // 2,启动流程实例

    @Test

    public void startProcessInstance()throws Exception {

        processEngine.getExecutionService().startProcessInstanceByKey(

                "helloworld");

    }

 

    // 3,查询我的个人任务列表

    @Test

    public voidfindMyPersonalTaskList() throws Exception {

//      String userId = "员工";

//      String userId = "部门经理";

         String userId = "总经理";

 

        // 查询

        List<Task> taskList =processEngine.getTaskService().findPersonalTasks( userId);

 

        // 显示

        System.out.println("=============" + userId + "】的个人任务列表 ============");

        for (Task task : taskList) {

            System.out.println("id="+ task.getId()//

                    + ",name=" + task.getName()// 任务名称

                    + ",assignee=" + task.getAssignee()); // 办理人

        }

    }

 

    // 4,办理任务

    @Test

    public void completeTask() throwsException {

        String taskId ="30001";

        processEngine.getTaskService().completeTask(taskId);

    }

}

 [t1]在java.util.logging.Level的javadoc中列出了可配置的所有输出级别为(由高到低):

·      SEVERE(highest value)

·      WARNING

·      INFO

·      CONFIG

·      FINE

·      FINER

·      FINEST(lowest value)

 [t2]如使用MySQLDialect,就会在流程实例结束时抛异常:com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Cannot delete or update a parent row: a foreign key constraint fails(`jbpm44_20101028/jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY(`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))。


你可能感兴趣的:(JBPM4.4:入门)