jBPM开发入门指南(4)

来源:互联网 发布:nginx测试配置文件 编辑:程序博客网 时间:2024/06/04 23:27
 

7 jBPM的客户端开发

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

 

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

packagecom.sample;

 

importjunit.framework.TestCase;

 

importorg.jbpm.JbpmConfiguration;

importorg.jbpm.JbpmContext;

importorg.jbpm.context.exe.ContextInstance;

importorg.jbpm.graph.def.ProcessDefinition;

importorg.jbpm.graph.exe.ProcessInstance;

 

publicclassSimpleProcessTest extends TestCase {

 

    privateJbpmConfiguration config = JbpmConfiguration.getInstance();

    privateJbpmContext ctx = config.createJbpmContext();

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

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

    privateProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld");

 

    publicvoidtestNewRequest() {

        longid = newRequest();

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

        checkNewRequest(id);

        confirmRequest(id);

        checkconfirmRequest(id);

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

    }

 

    /**

     *创建一个请假单

     *

     *@return

     */

    privatelongnewRequest() {

        // 创建一个新流程

        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();

        returnpi.getId();

    }

 

    /**

     *检查请假单的数据

     *

     *@paramid

     */

    privatevoidcheckNewRequest(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());

    }

 

    /**

     *审批陈刚的请假申请

     *

     *@paramid

     */

    privatevoidconfirmRequest(long id) {

        ProcessInstance pi = ctx.loadProcessInstance(id);

        ContextInstance ci = pi.getContextInstance();

        // 不通过

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

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

        pi.signal();

    }

 

    privatevoidcheckConfirmRequest(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());

    }

 

}

 

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