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. OC的构造方法与分类知识点总结

    OC语言构造方法: 用来初始化对象的方法,对象方法,以减号开头 为了让对象创建出来,成员变量就会有一些固定的值 重写构造方法的注意点: 先调用父类的构造方法([super init]) 再进行子类内部 ...

  2. Yii2中如何使用CodeCeption

    Yii2和CodeCeption CodeCeption是一个全栈的PHP测试框架,关于CodeCeption的介绍见:CodeCeption官方文档. Yii2官方增加了对CodeCeption的支 ...

  3. Linux下访问文件的基本模式

    源址:http://blogread.cn/it/article/6523?f=wb 访问文件的操作主要是指读文件和写文件,下文简单说明内核中几种常见的访问文件的方式. 普通模式 读写系统调用的默认方 ...

  4. C#用WebClient下载File时操作超时的问题

    原文:C#用WebClient下载File时操作超时的问题 今天很SB,被这个问题卡住了.那段代码也是网上找的.结果发现只能下载一个文件,第二次下载的时候就会出现“操作超时”的问题. 这个是原代码: ...

  5. jquery实现文字上下滚动效果

    文字上下滚动是经常用到的js效果,这里介绍一种上下渐隐渐出的文字展现效果! 代码实现很简单,只需要引入jquery就可以. 代码如下: <!DOCTYPE> <head> &l ...

  6. bat批量目光声明

    写bat同一批次,盯着函数应使用.这个程序对可读性 在批处理,凝视节还有一种更常用的方法: goto start      = 能够是多行文本,能够是命令      = 能够包括重定向符号和其它特殊字 ...

  7. oracle中intersect的用法

    和 UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的.不同的地方是, UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 I ...

  8. w5cValidator【AngularJS】 2.0 版本发布

    w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些错误提示的功能,让大家不用在每个表单上写一些提示信息的模板,专心的去实现业务逻辑. 代码地址:https://g ...

  9. sql汉字转拼音

    /*创建取拼音首字母函数*/ create function [dbo].[fn_ChineseToSpell](@strChinese varchar(500)='') returns varcha ...

  10. 获得WCF Client端的本地端口

    获得WCF Client端的本地端口 最近需要做个小功能,当WCF调用远程服务时,显示该调用的网速或流量.其中比较关键的一步就是需要获得WCF  Client端的本地端口,原来以为是个简单的事情,结果 ...