随笔 - 5, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

2010年3月3日

[导入]jBPM开发入门指南(5)

前篇说起要讲在JBPM中实现用户权限,但这段时间比较忙,一直拖着。这里先把jbpm自带的websale例子放上来,大伙先将就看看。这个例子我已经把它抽取了出去,网页部份丢弃了。在看的时候主要看WebsaleTest.java,看看它的用户权限是怎么用的。

几个重点:
(1) jBPM没有角色的概念!!! 很多人把ActorID理解成角色,那是相当错误的。jBPM只有参与者的概念,也就是ActorID,它可以是用户ID,也可以是角色ID,也可以什么都不是。你要自己去把用户角色等东东和ActorID映射起来。不过一般我们把ActorID设置成角色,但jbpm websale却是设置成用户的。
(2)用户信息的入口是JbpmContext,里面有一个setActorID方法。你用户登录时候,把一些用户信息set进去。
(3)泳道概念:你去看看UML中的带泳道的活动图,那就是象一个游泳池里的泳道一样。


安装提示:
 <classpathentry kind="con" path="JBPM/jBPM 3.1.2"/>
.classpath的这一句很可能和你电脑的设置不符,这是jbpm插件的一个设置,指向jbpm的HOME目录,以便找到jbpm的jar包。你按照你电脑上的设置相应修改一下这一行。


websale的eclipse项目ZIP包:http://www.blogjava.net/Files/chengang/chen-jbpm_websale.zip

陈刚 2006-09-16 19:09 发表评论

文章来源:http://www.blogjava.net/chengang/archive/2006/09/16/70069.html

posted @ 2010-03-03 09:36 施 阅读(100) | 评论 (0)编辑 收藏

[导入]jBPM开发入门指南(4)

7   jBPM 的客户端开发

有了前面的 HelloWorld 后台流程,我们就要开始客户端程序了。正如前面提到的,本文不写 JSP ,而改采用 JUnit 的形式,输出则用 System.out.println 。举一反三,知道在方法中输入及用 println 输出,在 JSP SWING GUI 界面还不是一样嘛。

 

这个 JUnit 客户端,我们就借用创建项目时自动生成的 SimpleProcessTest.java 了,改写后如下:

package com.sample;

 

import junit.framework.TestCase;

 

import org.jbpm.JbpmConfiguration;

import org.jbpm.JbpmContext;

import org.jbpm.context.exe.ContextInstance;

import org.jbpm.graph.def.ProcessDefinition;

import org.jbpm.graph.exe.ProcessInstance;

 

public class SimpleProcessTest extends TestCase {

 

    private JbpmConfiguration config = JbpmConfiguration.getInstance();

    private JbpmContext ctx = config.createJbpmContext();

    // helloworld 对应于 jbpm_processdefinition 表的 name 字段值,也即 processdefinition.xml name

    // 这个值得取比较耗时,实际项目里最好和“数据库的 JDBC 连接”一样,让它共享,不要频繁打开关闭。

    private ProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld");

 

    public void testNewRequest() {

        long id = newRequest();

        System.out.println("id=" + id);

        checkNewRequest(id);

        confirmRequest(id);

        checkconfirmRequest(id);

        ctx.close();// 关闭 jbpm 容器

    }

 

    /**

      * 创建一个请假单

      *

      * @return

      */

    private long newRequest() {

        // 创建一个新流程

        ProcessInstance pi = processDefinition.createProcessInstance();

        // 取得流程的数据环境

        ContextInstance ci = pi.getContextInstance();

        // 创建一张请假单

        ci.setVariable("name", " 陈刚 www.chengang.com.cn" );

        ci.setVariable("day", 2);

        assertEquals(null, ci.getVariable("note"));

        // 请假申请结束,转到下一个流程结点

        pi.signal();

        return pi.getId();

    }

 

    /**

      * 检查请假单的数据

      *

      * @param id

      */

    private void checkNewRequest(long id) {

        // 从数据库提取原流程

        ProcessInstance pi = ctx.loadProcessInstance(id);

        // 取得流程的数据环境

        ContextInstance ci = pi.getContextInstance();

        // 创建一张请假单

        assertEquals(" 陈刚 www.chengang.com.cn" , ci.getVariable("name"));

        assertEquals(Integer.valueOf(2), ci.getVariable("day"));

        assertEquals(" 我要请假 " , ci.getVariable("note"));

 

        // 当前是结点为 confirm

        assertEquals(pi.getRootToken().getNode().getName(), "confirm");

        // 流程还没结束

        assertFalse(pi.hasEnded());

    }

 

    /**

      * 审批陈刚的请假申请

      *

      * @param id

      */

    private void confirmRequest(long id) {

        ProcessInstance pi = ctx.loadProcessInstance(id);

        ContextInstance ci = pi.getContextInstance();

        // 不通过

        ci.setVariable("note", " 不准请假,继续加班 " );

        // 审批结束,到下一个流程结点

        pi.signal();

    }

 

    private void checkConfirmRequest(long id) {

        ProcessInstance pi = ctx.loadProcessInstance(id);

        ContextInstance ci = pi.getContextInstance();

        // ConfirmAction 类在 signal 后执行,所以覆盖了经理的审批意见

        assertEquals(" 准假 " , ci.getVariable("note"));

 

        // 当前是结点为 end

        assertEquals(pi.getRootToken().getNode().getName(), "end");

        // 流程结束了

        assertTrue(pi.hasEnded());

    }

 

}

 

这个例子还是很简单,而且关键是缺少用户、组、权限等工作流系统必须的东西,不过没关系。下面的内容我将完成一个更完整的实例。

陈刚 2006-08-24 18:15 发表评论

文章来源:http://www.blogjava.net/chengang/archive/2006/08/24/65608.html

posted @ 2010-03-03 09:36 施 阅读(89) | 评论 (0)编辑 收藏

[导入]jBPM开发入门指南(3)

     摘要: 5  安装 jBPM 的 Eclipse 开发插件 有个辅助工具开发起来方便一点,只不过现在 jBPM 的开发工具插件功能还不算太强,也就一个“项目创建向导”的功能,让你: (1)不用再去配置 cla...  阅读全文

陈刚 2006-08-23 19:26 发表评论

文章来源:http://www.blogjava.net/chengang/archive/2006/08/23/65346.html

posted @ 2010-03-03 09:36 施 阅读(88) | 评论 (0)编辑 收藏

[导入]jBPM开发入门指南(2)

4 数据库初始化

jBPM 需要数据库支持, jBPM 会把自己的一个初始化数据存储到数据库,同时工作流的数据也是存储到数据库中的。 jBPM 使用 Hibernate 来做为自己的存储层,因此只要是 Hibernate 支持的数据库, jBPM 也就支持。

 

本文先以 MySQL 为例,然后再以 Oracle 为例,来谈谈 jBPM 的数据库初始化操作。

 

注:在上面的 JBoss 自带的示例中,并没有设置数据库,那是因为 jBPM 默认使用的是内存数据库 hsqldb

4.1  MySQL

 

1 、首先安装 MySQL

MySQL 的安装比较简单,网上也有很多文章,本文不再赘述。本指南所用 MySQL 版本为 MySQL 4.1 for windows )。再找一个 MySQL 客户端,目的是方便查看数据库中的数据,本文推荐使用 MySQL 网站上免费提供的“ MySQL Query Brower ”,当然你用其他的客户端也行,比如 MySQL-Front

 

2 、建库

MySQL 中创建一个库,库名: jbpm

 

3 、生成建表的 SQL 语句并建表

jbpm-starters-kit-3.1.1 下的子目录 jbpm 改名为 jbpm.3 ,否则在执行下面的 ant 命令时会报如 jbpm.3 目录不存在的错误:

D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:361: The following error occurred while executing this line:

D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:68: Basedir D:\jbpm-starters-kit-3.1.1\jbpm.3 does not exist

 

DOS 窗下,进入 D:\jbpm-starters-kit-3.1.1\jbpm-db 目录,执行如下命令:

ant mysql.scripts

 

执行成功后,在 D:\jbpm-starters-kit-3.1.1\jbpm-db\build\mysql\scripts 目录里生成了四个 sql 文件,它们做什么用的一看名字就知道了。在 MySQL 客户端中执行“ mysql.create.sql ”脚本,这样将在 jbpm 库中创建一个个的数据表。

 

 

4.2  Oracle

先安装好 Oracle 服务器。我们公司有现存的 Oracle 服务器,也提供给了我一个属于我自己的用户名,一登录就可以任意在我的库之下创建表了。所以这一步就省了,没有的自个先装好吧。

访问 Oracle 推荐用“ PLSQL Developer ”。不过要连接 Oracle 还要在本机上装上 Oracle 自己的客户端程序,里面提供了 JDBC 包和一些配置。要连接服务器还得配置一下,我一般都是不用 GUI 而直接改 tnsnames.ora 文件,在我的电脑里此文件的目录地址是: D:\oracle\ora92\network\ADMIN\tnsnames.ora ,内容如下 ( 两面有两个配置了 )

# TNSNAMES.ORA Network Configuration File: E:\oracle\ora92\network\admin\tnsnames.ora

# Generated by Oracle configuration tools.

 

WXXRDB_192.168.3.2 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.2)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = wxxrDB)

      (SERVER = DEDICATED)

    )

  )

 

WXXRDB_192.168.4.2 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.4.2)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = wxxrDB)

      (SERVER = DEDICATED)

    )

  )

 

前面都是 Oracle 的一些知识,不会的 Google 一下吧。最后配置好后,用 PLSQL Developer 输入你的用户名和密码联接到 Oracle ,就算 OK 了。

 

参考上面 MySQL 的步骤,基本一样:

(1)       jbpm 改名为 jbpm.3

(2)       再执行 ant oracle.scripts

(3)       jbpm-db\build\oracle\scripts 目录的 oracle.create.sql 脚本,在 Oracle 中生成 jBPM 的所有表。在“ PLSQL Developer ”中可以新建一个 Command Windows 窗口然后输入命令: @D:\jbpm-starters-kit-3.1.1\jbpm-db\build\oracle\scripts\oracle.create.sql

 

作者简介
陈刚,广西桂林人,著作有《Eclipse从入门到精通》
您可以通过其博客了解更多信息和文章:
http://www.ChenGang.com.cn



陈刚 2006-08-22 18:44 发表评论

文章来源:http://www.blogjava.net/chengang/archive/2006/08/22/65132.html

posted @ 2010-03-03 09:36 施 阅读(136) | 评论 (0)编辑 收藏

[导入]jBPM开发入门指南(1)

工作流虽然还在不成熟的发展阶段,甚至还没有一个公认的规范标准。但其应用却已经在快速展开,这说明市场对工作流框架的需求是急迫而巨大的。

我们公司的后台短信管理系统涉及短信编发、领导层层审核等操作,这是一个比较典型的工作流系统。过去我们用的工作流引擎是 shark ,然后在使用后发现其过于庞大,后台数据库操作频繁而未进行优化,直接导致的后果就是前台操作缓慢。于是经研究决定,将工作流引擎由 shark 换成 jBPM

jBPM 之前是一个开源软件,后加入 JBoss 组织。正好我们公司也是用 JBoss 的。不过 jBPM 并没有绑定在 JBOSS 上, Tomcat 等也可以使用它。

jBPM 的正处在不断发展中,做为开源软件的特点,其设计变化往往很大。所以一些过去的资料可能已经不适用了。于是作者根据自己的使用经验,重新整理出这份文档,以备学习参考。

注:本文使用的 jBPM 版本为 3.1.1

环境准备

1、安装JDK

所有 JAVA 开发第一个需要安装的,没什么好说的。记得把系统变量 JAVA_HOME 设上。

2、安装Ant

Ant 是使用 jBPM 必须的一个工具。 jBPM 中的很多操作都要用到 Ant

安装方法:

1 )先下载: http://archive.apache.org/dist/ant/binaries/ ,选一个如: apache-ant-1.6.5-bin.zip

2 )解压到 D:\ant (当然其他目录也可以)。

3 )设置如下系统变量: ANT_HOME=d:\ant

4 )把 %ANT_HOME%\bin 加入到系统变量 PATH 中。

3、安装Eclipse

Eclipse 不是开发 jBPM 必须的工具,但它是对 jBPM 开发很有帮助的工具,特别是 jBPM 提供了一个 Eclipse 插件用来辅助开发 jBPM 。关于 Eclipse 的安装不赘述了,本文用的版本是: Eclipse3.2

 

安装 jBPM

jBPM 的下载地址: http://www.jboss.com/products/jbpm/downloads  

l           JBoss jBPM jBPM 的软件包

l           JBoss jBPM Starters Kit  是一个综合包,它包括了 jBPM 软件包、开发插件、一个配置好了的基于 JBoss jBPM 示例、一些数据库配置文件示例。

l           JBoss jBPM Process Designer Plugin  是辅助开发 jBPM Eclipse 插件。

l           JBoss jBPM BPEL Extension jBPM 关于 BPEL 的扩展包

本指南选择下载: JBoss jBPM Starters Kit 。下载后解压到 D:\jbpm-starters-kit-3.1 ,目录下含有五个子目录:

l           jbpm   jBPM 的软件包

l           jbpm-bpel 只含有一个网页

l           jbpm-db 各种数据库 hibernate 配置文件示例,有些还包含了相应的 jdbc 驱动程序。

l           jbpm-designer  辅助开发 jBPM Eclipse 插件,具体在 jbpm-gpd-feature 子目录中

l           jbpm-server  一个已经配置好了的基于 JBoss jBPM 示例 .

 

感觉下工作流

前面我们说了,在 JBoss jBPM Starters Kit jbpm-server 目录是一个已经配置好的了 jBPM 示例,那么让我们来感觉一下 jBPM 做出的东西吧。

 

双击 jbpm-server 目录下的 start.bat 文件,启动 JBoss 服务。这时会打开一个 DOS 窗口,启动完成后,日志会不断输出,其中最后一句是“ 13:55:39,937 DEBUG [StaticNotifier] going to wait for (CMD_EXECUTOR, java.lang.Object@1df59bd) ”,这表示 jBPM 在开始工作了,它不断进行轮询。

打开网页: http://localhost:8080/jbpm/  得到如下画面

 20060713_image001.jpg

这是一个已经用 jBPM 开发好的用户定单流程,具有下单、审核、估价等流程。它所用的数据库是一个内置的数据库。

cookie monster 用户登录,选择“ create new web sale order ”可以创建一个定单。如下图所示,在图左边是填写的定单情况,右边一整个定货流程的示意图,红色框表示流程进行到哪一步了。填写好定单好,选择“ Save and Close Task ”,完成定单提交。

 20060713_image002.jpg

选择右上角的“ Login as another user ”以另外一个用户名 ernie 登录。这时可以看到 ernie 用户的任务列表中多了一项。

 20060713_image003.jpg

点进去后,显示如下画面。这个示例对中文的支持不好,全都显示成了 unicode 码了。不管这什么多,反正知道是这么回事就行了。在 comment 项填写意见,选 OK 按钮,进入到下一步。如果选择 more info needed 按钮,则打回给 cookie monster 用户修改定单。

 20060713_image004.jpg

下面的流程,这里就不再赘述了。在这个很标准的工作流示例中,我们基本可以看到 jBPM 的应用范围还是比较广的。而且从这个示例,我们是看不出有 jBPM 的,也就是说 jBPM 在后台起着作用。

从这个例子,还看不出 jBPM 的优势。不过,如果在一个流程不确定,经常需要变动的项目中, jBPM 的好处将会显然出来。应用 jBPM 后,改变流程只需改变流程描述文件,这将在后面的内容提到。

这是一个已做好的示例,接下来我们将仿造这个实例来开发一个请假流程。

作者简介
陈刚,广西桂林人,著作有《Eclipse从入门到精通》
您可以通过其博客了解更多信息和文章:http://www.chenGang.com.cn



陈刚 2006-07-13 15:03 发表评论

文章来源:http://www.blogjava.net/chengang/archive/2006/07/13/57986.html

posted @ 2010-03-03 09:36 施 阅读(211) | 评论 (0)编辑 收藏