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小叙的更多相关文章

  1. JBPM的.jpdl.xml文件中文出现乱码

    在Eclipse中使用jbpm提供的工作流设计器设计好流程后,打开.jpdl.xml后发现中文全是乱码 项目和文件编码设置都是UTF-8,但是依旧乱码. 在Eclipse的配置文件 eclipse.i ...

  2. 《java入门第一季》之类(String类常见方法小叙)

    String类下面的构造方法和一些常见的方法: /* * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,可以知道 * A:字符串字面值"abc&quo ...

  3. Asp.net 上传文件小叙(修改FileUpload显示文字等)

    想要在asp.net网站上上传文件就得用到FileUpload,可是这个控件中“浏览”没法修改,可以使用html中<input type="file" 来解决该问题. 首先页 ...

  4. C# 小叙 Encoding (一)

    前言 众所周知计算机只能识别二进制数字,如1010,1001.我们屏幕所看到的文字,字符都是和二进制转换后的结果.将我们的文字按照某种规则转换二进制存储在计算机上,这一个过程叫字符编码,反之就是解码. ...

  5. BeforeFieldInit的小叙

    BeforeFieldInit是什么 上片的文章中我们看到了有静态构造函数,和没有静态构造函数,代码的执行顺序有着显著的区别.然后,我们反编译了下代码,发现了在类中有一个BeforeFieldInit ...

  6. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  7. jbpm系列之五--使用decision节点判断分支情况

    我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点.类似java中的switch,根据不同的状态,跳转到不同的节点. 首先我们定义一个流程信息,jpdl流程图如下 明显的可以看到,在此种情况下 ...

  8. Jbpm4.4 使用

    最近工作项目中需要用到工作流.于是找到了jbpm.关于jbpm的一些概念就不说了 1) 首先下载jbpm,这里我选择了jbpm4.4 从官网上可以下载  http://sourceforge.net/ ...

  9. 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

    今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...

随机推荐

  1. 国内ng学习网站

    Ngnice-国内ng学习网站2015-01-25 21:30 by 破狼, 534 阅读, 3 评论,收藏, 编辑 今天给angular新手介绍一个国内开源的ng学习网站http://www.ngn ...

  2. SQL常规查询详解

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...

  3. HDU 5045 Contest

    pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...

  4. JUnit介绍

    8.1.1  JUnit简介 JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强 大. 下面是JUnit一些特性的总结: — 提供的API可以让开发人员写出测试结果明 ...

  5. tornado settings想到的

    今天有足够多的时间来看看Tornado中RequestHandler和Application这两个类的关系. 昨天想要调用settings中的内容,找了好半天不知道怎么在handler中使用setti ...

  6. HDU 5185 Equation (DP)

    题目:LINK 题意:求满足题目要求的x序列的种类数. 能够发现符合条件的序列去重后是一个0, 1, ..., k的连续序列(k满足k*(k+1)/2 <= n) ,则这个去重后的序列长度最长为 ...

  7. highchart几个图表马金摘要

    1)  Js的引入顺序不对,导致highchart的图表出不来. 由于Highchart插件中用到了jquery,jquery的js要在引入highchart的js之前引入,否则当会导致当载入high ...

  8. 免费的编程中文书籍索引 from github

    免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿. 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些 ...

  9. C# 6.0 功能预览

    C# 6.0 功能预览 (一) 一.索引的成员和元素初始化 1.1 原始初始化集合 Dictionary 1.2 键值初始化集合 Dictionary 1.3 运算符 $ 初始化集合 Dictiona ...

  10. 排序算法的C#实现

    8种主要排序算法的C#实现   新的一年到了,很多园友都辞职要去追求更好的工作环境,我也是其中一个,呵呵! 最近闲暇的时候我开始重温一些常用的算法.老早就买了<算法导论>,一直都没啃下去. ...