JBPM之JPdl小叙
JPdl:jbpm流程定义文件,下面是一个简单的流程定义文件:
<?xml version="1.0" encoding="UTF-8"?> <process name="Purchase order" xmlns="http://jbpm.org/4.4/jpdl"> <start>
<transition to="Verify supplier" />
</start> <state name="Verify supplier">
<transition name="Supplier ok" to="Check supplier data" />
<transition name="Supplier not ok" to="Error" />
</state> <decision name="Check supplier data">
<transition name="nok" to="Error" />
<transition name="ok" to="Completed" />
</decision> <end name="Completed" /> <end name="Error" /> </process>
下面对JPdl中各个Element进行介绍
(1) process
attribution:1.name:这个流程的名字,是必须的
2.key
3.version
(2)start
1.name:这个activity的名称,开始activity是每个流程的第一个执行的activity所以可以没有name
[2]transition
(3)states
<state name="a">
<transition to="b" />
</state>
(4)带分支的states
<state name="wait for response">
<transition name="accept" to="submit document" />
<transition name="reject" to="try again" />
</state>
ProcessInstance processInstance = executionService
.startProcessInstanceByKey("StateChoice");
通过process的name来得到这个process的instance,然后使用这个instance来做一些操作
String executionId = processInstance
.findActiveExecutionIn("wait for response")
.getId();
得到name等于wwait for response的states
processInstance = executionService.signalExecutionById(executionId, "accept");
这个states接受一个外界为accept的信号,然后根据transition的name来选择转向下一个states
(5) decision:takes one path of many alternatives outgoings,只能转向其中的一个节点
<decision name="evaluate document">
<transition to="submit document">
<condition expr="#{content=="good"}" />
</transition>
<transition to="try again">
<condition expr="#{content=="not so good"}" />
</transition>
<transition to="give up" />
</decision>
de cision.transition.condit
ion表示转向下一个节点的条件设置,expr="#{content =="good"}"
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("content", "good");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("DecisionConditions", variables);
通过对varibles的设置可以控制流程下一个节点的转向
(6)decision expr
<decision name="evaluate document" expr="#{content}" >
<transition name="good" to="submit document" />
<transition name="bad" to="try again" />
<transition name="ugly" to="give up" />
</decision>
通过在执行流程的过程中设置content的值可以控制"evaluate document"下一个节点转向
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("content", "good");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("DecisionExpression", variables);
(7)decisiton handler:通过自定义的程序来控制转向
<decision name="evaluate document">
<handler class="org.jbpm.examples.decision.handler.ContentEvaluation" />
<transition name="good" to="submit document" />
<transition name="bad" to="try again" />
<transition name="ugly" to="give up" />
</decision>
接下来创建 ContentEvaluation这个类,实现DecisionHandler这个接口
public class ContentEvaluation implements DecisionHandler {
public String decide(OpenExecution execution) {
String content = (String) execution.getVariable("content");
if (content.equals("you're great")) {
return "good";
}
if (content.equals("you gotta improve")) {
return "bad";
}
return "ugly";
}
}
(8)fork and join(同时)
1.fork activity allows a single path of execution to be of split into two or more branches which can execute
activities concurrently(所有这些分支会被同时执行)
2.join actvity allows multipart paths of execution to join into one path which execute when all path execute
success(join是由多个分支流入,一个活动流出,必须等到前面流入的分支都执行完成再会留到下一个节点,他们之间的关系相当于"与"的关系)
(9)end 流程的结束,一个流程可以定义多个不同的结束节点
<end name="ok"/>
<end name="bad request"/>
<end name="internal server error"/>
<end name="ok" state="completed"/> 返回到名称为completed的states
(10)task:create a task for a person in the task component
<task name="review"
assignee="#{order.owner}">
你也可以assignee = "jeck",把这个task分配给了jeck这个人
<transition to="wait" />
</task>
public class Order implements Serializable {
String owner;
public Order(String owner) {
this.owner = owner;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("order", new Order("johndoe")); //order相当于指向这个Order对象的一个引用,order.owner来获取Order对象的owner这个属性
ProcessInstance processInstance = executionService
.startProcessInstanceByKey("TaskAssignee", variables);
List<Task> taskList = taskService.findPersonalTasks("johndoe");
上面的代码可以根据某个人的Id来得到这个用户所有相关的task
(11)可以将一个task分配给一个用户组,只要用户在这个组里面就要去完成这个task,like follow code:
<task name="review"
candidate-groups="sales-dept"> <!-- candidate-groups 表示这个组的名称--> <transition to="wait" />
identityService.createGroup("sales-dept"); //创建一个用户组
identityService.createUser("johndoe", "johndoe", "John", "Doe"); //创建一个用户
identityService.createMembership("johndoe", "sales-dept"); //将这个用户和这个组相关联
identityService.createUser("joesmoe", "joesmoe", "Joe", "Smoe");
identityService.createMembership("joesmoe", "sales-dept");
(12)task assignment handler
<task name="review" g="96,16,127,52">
<assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask">
<field name="assignee">
<string value="johndoe" /> <!--设置默认值-->
</field>
</assignment-handler>
<transition to="wait" />
</task>
public class AssignTask implements AssignmentHandler {
String assignee;
public void assign(Assignable assignable, OpenExecution execution) {
assignable.setAssignee(assignee);
}
}
(13)task swimlanes:可以将多个task定义为一个swimlanes,然后将这个泳道分配给用户或者用户组
(1)name(requerid)
(2)assignee
(3)candidate-groups
(4)candidate-users
<swimlane name="sales representative"
candidate-groups="sales-dept" /><!--将这个泳道分配给sales-dept用户组--> <start>
<transition to="enter order data" />
</start> <task name="enter order data"
swimlane="sales representative"> <!--表示这个task属于sales representative这个泳道--> <transition to="calculate quote"/>
</task> <task
name="calculate quote"
swimlane="sales representative">
<!--表示这个task属于sales representative这个泳道-->
</task>
(14)java 和 script自动执行的活动
(15)mail发邮件的活动
JBPM之JPdl小叙的更多相关文章
- JBPM的.jpdl.xml文件中文出现乱码
在Eclipse中使用jbpm提供的工作流设计器设计好流程后,打开.jpdl.xml后发现中文全是乱码 项目和文件编码设置都是UTF-8,但是依旧乱码. 在Eclipse的配置文件 eclipse.i ...
- 《java入门第一季》之类(String类常见方法小叙)
String类下面的构造方法和一些常见的方法: /* * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,可以知道 * A:字符串字面值"abc&quo ...
- Asp.net 上传文件小叙(修改FileUpload显示文字等)
想要在asp.net网站上上传文件就得用到FileUpload,可是这个控件中“浏览”没法修改,可以使用html中<input type="file" 来解决该问题. 首先页 ...
- C# 小叙 Encoding (一)
前言 众所周知计算机只能识别二进制数字,如1010,1001.我们屏幕所看到的文字,字符都是和二进制转换后的结果.将我们的文字按照某种规则转换二进制存储在计算机上,这一个过程叫字符编码,反之就是解码. ...
- BeforeFieldInit的小叙
BeforeFieldInit是什么 上片的文章中我们看到了有静态构造函数,和没有静态构造函数,代码的执行顺序有着显著的区别.然后,我们反编译了下代码,发现了在类中有一个BeforeFieldInit ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- jbpm系列之五--使用decision节点判断分支情况
我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点.类似java中的switch,根据不同的状态,跳转到不同的节点. 首先我们定义一个流程信息,jpdl流程图如下 明显的可以看到,在此种情况下 ...
- Jbpm4.4 使用
最近工作项目中需要用到工作流.于是找到了jbpm.关于jbpm的一些概念就不说了 1) 首先下载jbpm,这里我选择了jbpm4.4 从官网上可以下载 http://sourceforge.net/ ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
随机推荐
- VMWare Workstation:局域网PC连接虚拟机里的远程桌面或端口
很简单.做一个理解: 1.NAT 2.VM的网卡,相当于路由器 环境: 物理路由器:192.168.0.1 PC1(win):192.168.0.2 PC2(win):192.168.0.3 PC2里 ...
- sql点滴41—mysql常见sql语法
原文:sql点滴41-mysql常见sql语法 ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename ...
- 使用Python改写的身份证信息查询小程序
花了几天时间过了一遍python基础.真心感觉python让世界充满了爱…先简单的使用一下python好了,拿以前写的<C语言身份证信息查询系统(修改版)>开刀~ 很多东西,不需要考虑C语 ...
- Linux启用/关闭触摸板脚本
一个可以启动关闭触摸板的shell脚本 运行一次关闭,再次运行开启. [shell] #!/bin/bash ts=`synclient -l|grep TouchpadOff` ts=${ts#*= ...
- MUI初始化滚动区域
mui(".mui-scroll-wrapper").scroll().refresh(); 如果不是MUI对象,需要转一下才可 mui($("#areaDiv" ...
- leetcode[87] Partition List
题目:给定一个链表和一个数x,将链表中比x小的放在前面,其他的放在后头.例如: Given 1->4->3->2->5->2 and x = 3,return 1-> ...
- 读书笔记—CLR via C#章节4-7
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- JSON之FastJson
FastJson是什么? 从网上查到--- 官网地址:http://code.alibabatech.com/wiki/display/FastJSON/Overview(已关闭) FastJSOn是 ...
- Oracle琐碎笔记2
备注:以下所有操作均在sqlplus中执行. 开始前输入:spool c:\jiyi.txt;结束后输入:spool off;就会记忆操作的所有记录save c:\sql.sql;保存sql脚本可以使 ...
- IOS UI 第十一篇: UITABLEVIEW
DIY a tableviewcell : - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *) ...