1             swimlane:

具有流程角色的意思。一种多个任务由同一个actor执行的机制。swimlane中的第一个任务实例创建后分派时,会为该swimlane记住actor,后续的任务分派时将使用该actor。swimlane中的任务不能指定assignment,swimlane中的任务实例分派时,将由swimlane指定的assignment进行分派。swimlane中的第一个任务实例创建时,调用AssignmentHandler,此时传给AssignmentHandler的Assignable是一个SwimlaneInstance。

public interface AssignmentHandler extends Serializable {

void assign( Assignable assignable, ExecutionContext executionContext );

}

public interface Assignable {

public void setActorId(String actorId);

public void setPooledActors(String[] pooledActors);

}

TaskInstance和SwimlaneInstance都实现了Assignable。

2             assignment:

用于任务分派的元素。

actor-id:执行该任务的actor。

pooled-actors:可以执行该任务的actors。

两种分派模型:push和pull。

push:流程执行分派,调用Assignable.setActorId决定将该任务push到哪个user的任务列表。任务列表的获取:TaskMgmtSession.findTaskInstances(String actorId).

pull:该任务具有多个候选actor。由pool中的actor将任务pull进自己的任务列表。在pull之前任务对pool中的所有actor可见,pull后,actor-id变为pull的actor,并在pool中不可见。将actor-id置为null可以将该任务实例重新放回poll。调用Assignable.setPooledActors分派给pooledActors。

3             expression:

分派表达式。

identity comoponent:用户、组和许可权的管理,包括组织模型信息。

分派表达式示例:

<process-definition>

...

<task-node name='a'>

<task name='laundry'>

<assignment expression='previous --> group(hierarchy) --> member(boss)' />

</task>

<transition to='b' />

</task-node>

...

分派表达式语法:

first-term --> next-term --> next-term --> ... --> next-term

其中:

first-term ::= previous |

swimlane(swimlane-name) |

variable(variable-name) |

user(user-name) |

group(group-name)

next-term ::= group(group-type) |

member(role-name)

还可在action、delegation、decision condition中使用类似于JSP/JSF EL的表达式语言,如expression="#{myVar.handler[assignments].assign}"

4             delegation:

用来在流程执行过程中运行用户自定义代码的机制。可用于任务代理。

class(必需):完整类名。

config-type(可选):指定如何实例化和配置delegation对象。若没有则用默认constructor,并忽略配置信息。

field:configuration中的elementnames对应delegation中的域名;

示例:

public class MyAction implements ActionHandler {

// access specifiers can be private, default, protected or public

private String city;

Integer rounds;

...

}

对应的配置文件:

...

<action class="org.test.MyAction">

<city>Atlanta</city>

<rounds>5</rounds>

</action>

...

bean;constructor;configuration-property。

configuration(可选):xml文件,delegation配置信息。

5             start-state:

特殊node:启动节点。可以包含task、transition、event和exception-handler。

6             transition:

源节点是包含该transition的节点,目标节点由to指出。transition的名字是可选的。jBPM的路由功能依赖于transition名字的唯一性。但如果多个transition有相同的名字,将选择第一个。节点transition list中的第一个是其default transition。

7             task:

任务定义,指出如何创建和分派任务实例。可以在task-node,也可以在process-definition中定义。process-definition范围内task name必须唯一。

任务可以指定优先级。任务实例可以修改此优先级。

该任务可以属于一个swimlane,此时它的分派由对应的swimlane执行。

duedate指出任务的超时日期。

task的signalling属性指出当该任务实例完成时,可以发送一个signal给其token来继续流程的执行。task的blocking属性指出当该任务实例没完成之前,与之相关的token不能离开该task-node。默认设置是signalling和non-blocking。

8             task-controller:

可选。

任务创建时,可以用controller来移植任务实例变量;任务实例完成时,可以通过controller来向流程实例变量提交任务实例变量。

并不强迫一定要使用controller,仅当有下列需求时使用controller:

1)              创建流程实例变量在任务实例中的副本,使得对任务实例变量的改变不会影响流程实例变量。直到流程完成再将任务实例变量提交。

2)              流程实例变量与任务实例变量不是一一对应关系。例如三个流程变量“sales in january”、“sales in februry”和“sales in march”,在任务中可能需要用到的是这三个变量的平均值。

controller在流程变量(process context)和用户接口应用程序之间起一个桥的作用(如下图所示)。当创建任务实例时,controller负责从流程变量中摘录信息来创建任务变量。这些变量作为用户输入提供给用户接口应用。外部输入也存储在任务变量中。当任务结束时,controller负责用任务实例数据更新流程变量。

简单的一对一映射的例子如下:

<task name="clean ceiling">

<controller>

<variable name="a" access="read" mapped-name="x" />

<variable name="b" access="read,write,required" mapped-name="y" />

<variable name="c" access="read,write" />

</controller>

</task>

name属性指流程变量名,mapped-name指任务中的变量名。access属性指出是否在任务创建时复制变量,或是否在任务结束后写回流程,或是否是必须的。access是可选的,默认值是"read,write"。

如果简单的一一映射不能满足需要,可以自定义TaskControllerHandler接口的实现:

public interface TaskControllerHandler extends Serializable {

void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);

void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);

}

并用如下方法定制自己的TaskControllerHandler实现:

<task name="clean ceiling">

<controller class="com.yourcom.CleanCeilingTaskControllerHandler">

-- here goes your task controller handler configuration --

</controller>

</task>

9             timer:

定时器。属性包括timer名、duedate、repeat和transition。transition指出定时器到时间时要执行该transition。

向节点加入timer最简单的方法是在节点定义中加入timer元素:

<state name='catch crooks'>

<timer name='reminder'

duedate='3 business hours'

repeat='10 business minutes'

transition='time-out-transition' >

<action class='the-remainder-action-class-name' />

</timer>

</state>

节点中指定的timer在离开该节点后不会执行。transition和action都是可选的。当执行一个timer会顺序发生如下事件:

1)  发送timer类型事件;

2)  如果指定了action,则执行该action;

3)  如果指定了transition,则通过该transition发送signal来恢复流程执行。

timer必须有唯一的名字,若没有指定timer名,将使用node名作为其名字。

timer由action创建和取消,分别是create-timer和cancel-timer。

10       action:

action可以放在event中,也可以放在node中。每个event都有一个action list,当发送一个event时,执行该event的action list中的所有action。event中的action执行不会影响流程执行控制流。node中的action则要负责流程执行的传递。

class指出action处理类,实现了ActionHandler。config-type指出如何配置该actionhandler类。如下示例:

public class RemoveEmployeeUpdate implements ActionHandler {

public void execute(ExecutionContext ctx) throws Exception {

String firedEmployee = (String) ctx.getContextInstance().

getVariable("fired employee");

Connection connection = ctx.getProcessInstance().

getJbpmSession().getSession().getConnection();

Statement statement = connection.createStatement();

statement.execute("DELETE FROM EMPLOYEE WHERE ...");

statement.execute();

statement.close();

}

}

对应流程定义:

<process-definition name="yearly evaluation">

...

<state name="fire employee">

<transition to="collect badge">

<action class="com.nomercy.hr.RemoveEmployeeUpdate" />

</transition>

</state>

<state name="collect badge">

...

</process-definition>

action的name和ref-name。ref-name可以放在任何能指定action的地方。ref-name的使用用来限制复杂action configuration的副本。或用于运行时action的执行的调度。

accept-propagated-events:是否允许事件沿着node—superstate—processdefinition进行传递。

11       event:

可以出现在process-definition、node和transition中。

属性由事件类型指出。有4种task-event类型:task-create、task-assign、task-start和task-end。一个事件对应有一个action list,当该事件发生时,执行list中的所有action。

可以定制自己的事件类型,通过GraphElement.fireEvent(String eventType, ExecutionContext executionContext)来发送事件。

12       script:

也是一种action,它用来执行beanshell script。默认情况下,script可以使用process、task、token、node、executeContext和taskInstance的所有variable作为自己的script variable,但script variable不能写回到process variable。

如下示例:

<process-definition>

<event type="node-enter">

<script>

System.out.println("this script is entering node "+node);

</script>

</event>

...

</process-definition>

可以在script中包含expression和variable子元素。variable元素的使用用来定制载入和存储变量的默认行为。如下示例:

<process-definition>

<event type="process-end">

<script>

<expression>

a = b + c;

</expression>

<variable name='XXX' access='write' mapped-name='a' />

<variable name='YYY' access='read' mapped-name='b' />

<variable name='ZZZ' access='read' mapped-name='c' />

</script>

</event>

...

</process-definition>

create-timer和cancel-timer是创建和取消定时器的action。

13       exception handler:

在process-definition、node和transition中可以指定一个exception handler list。每个exception handler都有一个action list。都发生exception时,在产生exception的delegation类所属层次结构中查找对应的exception-handler,找到则执行handler中的所有action。

与java异常处理机制不同,不能改变控制流。exception可以是caught,也可以是uncaught。exception可以由exception-handler caught。uncaught exception被抛给client。对于caught exception,图的执行会和没抛出exception一样继续执行。

在处理exception的action中,通过调用Token.setNode(Node node)可以将token放在图中的任意node。

14       node element

node

node类型的节点用于需要在node中执行用户自定义的代码。node类型节点有一个action,当执行到该节点时,执行action。actionhandler中的代码可以做任何你想做的事情,但要负责流程执行的继续。

所有节点类型都有name属性,async="true"时,表示流程可以异步执行。

state:

state本质上是一个wait state。它与task-node不同的地方是它不会创建任务实例。它可以用于与外部系统的交互。当进入该节点,向外部系统发送消息,然后等待,直到外部系统将响应消息发回该节点,导致调用token.signal(),从而触发流程的继续执行。

task-node:

任务分派节点。

task-node的signal属性值:

last

last-wait

first

first-wait

unsynchronized

never

create-tasks:boolean。default="true",该节点执行时是否创建任务实例。

end-tasks:boolean。default="false",该节点执行完后,若其中的任务实例没有end,是否将其end。

super-state:

一组节点的集合,可以嵌套,这给流程定义带来层次性结构。jBMP中可以将任意的节点组合成super-state。这些super-state通常代表应用的某个阶段。

superstate transition:所有离开该super-state的transition都可以由内部节点的token执行。transition可以到达superstate,此时token将被重定向到superstate的第一个节点。superstate外部的节点可以transition到内部节点,内部节点可以transition到外部节点,也可以到superstate自身。

superstate event:superstate专有的两个event:superstate-enter和superstate-leave。只要进入superstate就发送superstate-enter事件,只要离开superstate范围(不管是内部哪个node,只要是transition到外部node),就发送superstat-leave事件。

层次结构名:节点在节点集范围(流程或superstate)内,名字要唯一。可以通过层次名来引用。

<process-definition>

...

<super-state name="phase one">

<state name="preparation">

<transition to="../phase two/invite murphy"/>

</state>

</super-state>

<super-state name="phase two">

<state name="invite murphy"/>

</super-state>

...

</process-definition>

process-state:

用来执行子流程的节点。当进入该process-state,创建sub-process实例并执行,直到(default async="false")sub-process结束,才继续super process的执行。

一个process-state的例子:

<process-definition name="hire">

<start-state>

<transition to="initial interview" />

</start-state>

<process-state name="initial interview">

<sub-process name="interview" />

<variable name="a" access="read,write" mapped-name="aa" />

<variable name="b" access="read" mapped-name="bb" />

<transition to="..." />

</process-state>

...

</process-definition>

fork:

分支节点,将执行路径分解为多个并发执行路径,默认情况下,为每个离开该fork的transition创建一个子token,与到达该fork的token构成父子关系。

join:

默认情况下,到达join节点的token都必须有相同的父token,也就是这些token由同一个fork split出来。join负责end到达该节点的子token。当所有子token到达join,才继续父token的执行。join的leaving transition是唯一的。

decision:

判断节点。有两种判断模型,一种由process进行判断(在process-definition内),一种由外部实体(即不是process-definition的一部分)决定判断结果。

如果是流程决定判断,一种简单的办法是在transition中加入condition,condition是beanshell expression,它返回boolean值。运行时,decision节点在其leave transition中按它们定义顺序循环,直到找到第一个condition计算结果为true,take该transition。另一种办法是指定DecisionHandler,由该handler计算要take的transition返回给decision。

当由外部实体决定判断结果时,需要执行多次转换。即在decision前的wait state与外部实体交互,获取的结果进入decision进行判断。

end-state:

流程结束节点。

jpdl的参数(鹰击长空)相关推荐

  1. 在Dockerfile中设置G1垃圾回收器参数

    在Dockerfile中设置G1垃圾回收器参数 ENV JAVA_OPTS="\ -server \ -XX:SurvivorRatio=8 \ -XX:+DisableExplicitGC ...

  2. Java Calendar.add()方法的使用,参数含义。指定时间差。

    cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...

  3. java带参数的方法笔记_具有Java参数的方法的类声明

    类声明可以包含在Java中具有参数的方法.演示此过程的程序如下: 示例class Message { public void messagePrint(String msg) { System.out ...

  4. Gin 框架学习笔记(02)— 参数自动绑定到结构体

    参数绑定模型可以将请求体自动绑定到结构体中,目前支持绑定的请求类型有 JSON .XML .YAML 和标准表单 form数据 foo=bar&boo=baz 等.换句话说,只要定义好结构体, ...

  5. VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、

    1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...

  6. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  7. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  8. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  9. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

最新文章

  1. Object defineProperty
  2. windows 下使用 nc 命令报错,与 Linux 不同。
  3. C语言输出空格逐级递减,2021年计算机2级c语言笔试部分-20210514115908.doc-原创力文档...
  4. Python监视进程创建情况和系统服务状态
  5. 定义返回函数指针(地址)的函数
  6. python老师 招聘_崩了,Python玩大了! 程序员:牛,不可惜!
  7. 史上最强Android 开启照相或者是从本地相册选中一张图片以后先裁剪在保存并显示的讲解附源码...
  8. 深入解读Docker底层技术cgroup系列(4)——cgroup子系统cpu
  9. windows与linux线程,Linux和Windows两种风格的操作系统,创建线程的方式有何不同?...
  10. 安卓和php开发融云聊天室,聊天室
  11. 盛世昊通国文化艺术板块,弘扬中国传统文化
  12. Win10 Pro自己解决系列~~~~菇凉手动折腾~~丰衣足食
  13. c语言recy未定义标识符,C语言课程设计 材料管理系统.doc
  14. 租服务器的 直连100m是啥,如何知道我的服务器带宽是独享10M或者100M?
  15. 黄金短线交易技巧是什么?
  16. Git 笔记 - git rebase
  17. 青岛软控为机电软一体化企业的PLM建设树立样板
  18. 计算机的CPU的电路是多少KW,你的电脑多少瓦? 最全面的CPU功耗测试
  19. 交换机SNMP V3版本配置
  20. 记录对接京东宙斯API -- 发布商品

热门文章

  1. 电脑蓝屏,无限重启修复
  2. FoveaBox:Beyond Anchor-based Object Detector
  3. MySQL数据库(5):数据data 基本操作
  4. bigolive2020年度盛典技术总结
  5. Java IO流 - FileInputStream
  6. 如何用dreamweaver8创建框架
  7. 天津市河东区地铁站智慧公厕
  8. CSS中将无序列表的项目符号改为指定图片
  9. [转]过程导向与结果导向
  10. 【论文解读 IJCAI 2019 | ActiveHNE】Active Heterogeneous Network Embedding