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

}

}

jBPM开发入门指南(4)相关推荐

  1. 以太坊是什么 - 以太坊开发入门指南

    本文首发于深入浅出区块链社区 原文链接:以太坊是什么 - 以太坊开发入门指南 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及 ...

  2. 所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市

    今天是春节假期的最后一天,在这里给全国的朋友们拜个晚年,祝大家身体健康,晚年幸福啊.这个春节大家过的怎么样啊,我自己是在老家过的年,家乡的年味还是比较浓的,也再次感谢朋友圈的大家给我看了各地的风光和不 ...

  3. 《Office 365开发入门指南》上市说明和读者服务

    写在最开始的话 拙作<Office 365开发入门指南>上周开始已经正式在各大书店.在线商城上市,欢迎对Office 365的开发.生态感兴趣的开发者.项目经理.产品经理参考本书,全面了解 ...

  4. Android SELinux开发入门指南之如何增加Native Binder Service权限

      Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...

  5. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题

      Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...

  6. Android SELinux开发入门指南之如何增加Java Binder Service权限

      Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...

  7. unity 3d网络游戏实战(全).pdf_“游戏开发入门指南——Unity+”的食用指南

    虽然专栏的文章已在置顶中按内容分好类了([置顶]游戏开发入门指南专栏目录),但不排除仍然有初学者面对繁杂的内容感觉无从下手.因此额外带来一篇食用指南,旨在给想要通过本专栏学习游戏开发的同学一条相对容易 ...

  8. Apache Kafka开发入门指南

    Apache Kafka开发入门指南 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs Apache Kafka可以帮助你解决在发布/订阅架构中遇到消费数 ...

  9. Pmac联合QT开发入门指南

    Pmac联合QT开发入门指南 1.Pcommserver介绍 2. 获取PcommServer.exe 3. 通过QT的dumpcp工具生成COM组件 4. QTcreator中操作 4.1 与PMA ...

最新文章

  1. 【Android 逆向】Android 权限 ( 查看内存信息 | 查看 CPU 信息 | 查看电池信息 | 查看账户信息 | 查看 Activity 信息 | 查看 Package 信息 )
  2. linux重新编译mysql_linux下编译安装mysql++ | 学步园
  3. 用angr解二进制题目1
  4. php txt,PHP规范TXT文件
  5. 保证全对——2015年第六届蓝桥杯C/C++ B组部分解题报告
  6. Html、Css-----当有文字和图片的时候,需要文字和图片居中,怎么实现?不想文字换行怎么设置...
  7. SQLserver数据库反编译生成Hibernate实体类和映射文件
  8. ipv6相对于ipv4的改进
  9. ssms .net3.5_SSMS 18.4中SQL Server查询存储选项
  10. Centos下tomcat配置
  11. 关于Python编码这一篇文章就够了
  12. keil5 最新版注册机 下载
  13. Unity3D模型轻量化探索之CATIA
  14. C语言求等腰梯形面积,几道C语言的题目!
  15. 自律的力量 No Excuse: the power of self-discipline
  16. 平生事,此时凝睇,谁会凭栏意!(4)
  17. 2020年4月20日 星期一 晴 晚餐
  18. VUE 获奖名单滚动显示的两种方式
  19. 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料
  20. IsEmpty 函数

热门文章

  1. C# 设计模式 - 单例模式 演示
  2. STM32示波器 信号发生器
  3. JavaScript生成指定范围内的随机数
  4. Oracle10g数据库的树立
  5. Apple 的 CEO和Google的CEO在星巴克聊什么呢?
  6. regsvr32.exe
  7. hdfs查看目录大小文件大小
  8. TCP close_wait内幕
  9. python读取视频流做人脸识别_基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释...
  10. inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?