JBPM学习(一):实现一个简单的工作流例子全过程
test.png
test.jpdl.xml
<?xml version="1.0" encoding="UTF-8"?> <process name="test" xmlns="http://jbpm.org/4.4/jpdl">
<start g="247,9,48,48" name="start1">
<transition g="-69,-22" name="to 员工提交申请" to="员工提交申请"/>
</start>
<end g="244,326,48,48" name="end1"/>
<task assignee="员工" g="223,84,92,52" name="员工提交申请">
<transition g="-93,-22" name="to 部门经理审批" to="部门经理审批"/>
</task>
<task assignee="部门经理" g="226,161,92,52" name="部门经理审批">
<transition g="-81,-22" name="to 总经理审批" to="总经理审批"/>
</task>
<task assignee="总经理" g="222,244,92,52" name="总经理审批">
<transition g="-50,-22" name="to end1" to="end1"/>
</task>
</process>
Task |
assignee |
员工提交申请 |
员工 |
部门经理审批 |
部门经理 |
总经理审批 |
总经理 |
1.部署流程定义
a) 通过直接拿到.jpdl.xml和.png方式部署
@Test
public void deployProcessDefinition() {
processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromClasspath("test.jpdl.xml")//
.addResourceFromClasspath("test.png")//
.deploy();
}
b) 部署完后,在jbpm4_ployment表中有一条记录;在jbpm4_lob表有两条记录,分别为test.jpdl.xml和test.png。
2.启动流程实例
a) 通过key启动流程实例,.jpdl.xml中key不写默认为name属性
@Test
public void startProcessInstance() {
processEngine.getExecutionService().startProcessInstanceByKey("test");
}
b) 启动流程实例后:jbpm4_execution表中有一条员工提交申请的活动记录,此时进行到to员工提交申请环节。
3.员工操作
a) 查询未办理的任务列表
@Test
public void findMyTaskList() {
// 查询任务
String userId = "员工";
List<Task> list = processEngine.getTaskService().findPersonalTasks(userId); // 显示任务
System.out.println("========= 【"+userId+"】的未办理的任务列表 =========");
for (Task task : list) {
System.out.println("id=" + task.getId()//
+ ", name=" + task.getName()//
+ ", assignee=" + task.getAssignee()//
+ ", createTime=" + task.getCreateTime());
}
}
b) 查看到信息如下:有一条任务id为20002
========== 【员工】的未办理的任务列表 =========
id=20002, name=员工提交申请, assignee=员工, createTime=2014-05-02 16:48:04.0
c) 员工办理任务:提交申请环节
@Test
public void completeTask() {
String taskId = "20002";
processEngine.getTaskService().completeTask(taskId);
}
d) 员工执行完任务,即员工提交申请环节结束,环节进行到to部门经理审批,此时员工再查询个人任务列表结果为空。
4.部门经理操作
a) 查询未办理的任务列表
@Test
public void findMyTaskList() {
// 查询任务
String userId = "部门经理";
List<Task> list = processEngine.getTaskService().findPersonalTasks(userId); // 显示任务
System.out.println("========= 【"+userId+"】的未办理的任务列表 =========");
for (Task task : list) {
System.out.println("id=" + task.getId()//
+ ", name=" + task.getName()//
+ ", assignee=" + task.getAssignee()//
+ ", createTime=" + task.getCreateTime());
}
}
b) 查看到信息如下:有一条任务id为30001
========== 【部门经理】的未办理的任务列表 =========
id=30001, name=部门经理审批, assignee=部门经理, createTime=2014-05-02 16:49:06.0
c) 部门经理办理任务:提交申请环节
@Test
public void completeTask() {
String taskId = "30001";
processEngine.getTaskService().completeTask(taskId);
}
d) 部门经理执行完任务,即部门经理审批环节结束,环节进行到to总经理审批,此时部门经理再查询个人任务列表结果为空。
5.总经理操作
a) 查询未办理的任务列表
@Test
public void findMyTaskList() {
// 查询任务
String userId = "总经理";
List<Task> list = processEngine.getTaskService().findPersonalTasks(userId); // 显示任务
System.out.println("========= 【"+userId+"】的未办理的任务列表 =========");
for (Task task : list) {
System.out.println("id=" + task.getId()//
+ ", name=" + task.getName()//
+ ", assignee=" + task.getAssignee()//
+ ", createTime=" + task.getCreateTime());
}
}
b) 查看到任务id为40001
========== 【总经理】的未办理的任务列表 =========
id=40001, name=总经理审批, assignee=总经理, createTime=2014-05-02 16:49:33.0
c) 总经理办理任务:提交申请环节
@Test
public void completeTask() {
String taskId = "40001";
processEngine.getTaskService().completeTask(taskId);
}
d) 总经理执行完任务,即总经理审批环节结束,环节进行到to end1,此时总经理再查询个人任务列表结果为空。
6.流程实例执行完毕,此时jbpm4_execution表为空,历史记录表:jbpm4_hist_procinst出现一条记录。
JBPM学习(一):实现一个简单的工作流例子全过程的更多相关文章
- JBPM工作流(一)——实现一个简单的工作流例子
一.JBPM定义 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流 ...
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...
- Linux第三周学习总结——构造一个简单的Linux系统MenuOS
第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的cmake例子
一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库 #在当前目录新建一个build目录,然后cd build ...
随机推荐
- xss攻击入门
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意 ...
- Error -27791: Server xx has shut down the connection prematurely
最近在进行一次性能测试中遇到一个问题,并发较大的时候会出现LR出现Error -27791: Server xx has shut down the connection prematurely的ER ...
- c/c++ 重载 数组 操作符[] operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
// Note: //int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of ...
- [unity菜鸟] 笔记1 —— 函数篇
SendMessage() 调用其他物体中的指令,先在脚本中编写一个自定义的函数,然后使用SendMessage()命令来调用那个物体上的命令 //①将以下函数附给target对象 void Rena ...
- Android UI性能优化详解
设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...
- JQuery实现点击div以外的位置隐藏该div窗口
简单示例代码: <body> <script type="text/javascript" src="http://ajax.googleapis.co ...
- IPv6 tutorial – Part 7: Zone ID and unique local IPv6 unicast addresses
The zone ID is used to distinguish ambiguous link-local and site-local addresses. Unique local IPv6 ...
- Windows系统性能提升方法
看前提醒:在确认没有病毒和流氓软件的前提下,建议优化电脑:以下操作已经在Win7上试验,Win7以上的园友自己试验,自己感受,对电脑无害,但操作时请务必小心 设置虚拟内存 虚拟内存最小值物理内存1.5 ...
- 转:理解 Linux 的硬链接与软链接
Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程 创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键 ...
- openssl的CRYPTO_set_locking_callback
openssl可以在多线程环境下使用,但前提是向openssl提供线程锁设施,通过CRYPTO_set_locking_callback设置. 在一些复杂软件环境环境中,可能存在多个上层模块同时使用o ...