jDPL是jBPM的突出的流程语言。jPDL的目标 是尽量精简和尽可能的开发者友好
<?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:
以<process 作为根节点,相关属性: name、key、version
在一个流程里必须有一个开始节点。 一个流程必须至少拥有一个开始节点。 开始节点必须有一个向外的流向,这个流向会
在流程启动的时候执行
一个等待状态节点。 流程处理的流向会在外部触发器调用提供的API之前一直等待。 状态节点和其他的活动 不一样, 它没有其他任何属性或元素。
state可以有多个transition,在发出signal的时候(executionService.signalExecutionById()的时候),可以给予signalName(给出transition的名字),指定执行路线。
在多个选择中选择一条路径。也可以当做是一个决定。 一个决定活动拥有很多个向外的转移。当一个流向到达一个决定活动时, 会自动执行并决定交给哪个向外的转移。
判断transition中的条件(<condition expr="" lang="">),自动选择路线。
<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>
如果是唯一表达式,可以把expr放在decision节点中,在transition中,只需要在name属性中直接定义为表达式的值即可
<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>
唯一性管理是继承了DecisionHandler接口的java类。 决定处理器负责选择 向外转移。
<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>
流程的并发路径可以使用 fork
和 join
活动来建模。
fork出来,join结束
结束流向
默认情况下,结束活动会终结已完成流程处理实例。 因此在流程处理实例中, 仍然在活动的多个并发(concurrent)流向(concurrent) 也会结束
一个流程处理可以有多个end events
流向(execution)可以以不同的状态结束。可以用其他的方式列出流程处理实例的结果。 可以用end event的状态属性或者end-cancel 和end-error表示。
<end name="ok" state="completed"/> <end-cancel name="bad request"/> <end-error name="internal server error"/>
task---重点
在任务组件中,为一个人创建一个任务。
属性:
任务分配者,谁来执行这个任务
assignee:
任务候选人
candidate-groups:组的id列表
candidate-users: 人的id列表
如果是任务分配给组,查找个人任务的时候是找不到的(taskService.findPersonalTasks(用户)),通过按照组的方式查找可以找到(taskService.findGroupTasks(用户))
在处理之前,候选人必须接受一个任务。 这会表现为两个候选人在同一个任务上开始工作。 分组任务列表中,用户接口必须只接受对这些任务的接受”操作。
taskService.takeTask(task.getDbid(), "johndoe");
当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。 任务会从所有候选人的分组任务列表中消失, 它会出现在用户的已分配列表中。
用户只允许执行在他们的个人任务列表上的工作。 这应该由用户接口控制。
简单的,candidate-users
属性 可以用来处理用逗号分隔的一系列用户id。 candidate-users
属性可以和其他分配选项结合使用。
任务
分配处理器一个AssignmentHandler
可以通过编程方式来计算 一个任务的分配人和候选人。
Assignable
是任务 和泳道 的通用接口。 所以任务分配处理器可以使用在任务, 也可以用在泳道中
<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>
请注意,默认AssignmentHandler实现可以使用使用流程变量 任何其他Java API可以访问资源,像你的应用数据库来计算 分配人和候选人用户和组
当达到该任务,就会启动assignment-handler,进行执行人的分配;
任务
泳道一个流程中的多任务应该被分配给同一个用户或候选人。 一个流程中的多任务可以分配给一个单独的泳道。流程实例将记得候选人和用户,在泳道中执行的第一个任务。 任务序列在同一个泳道中将被分配给这些用户和候选人。
一个泳道也可以当做一个流程规则。 在一些情况下, 这可能与身份组件中的权限角色相同。 但是实际上它们并不是同一个东西。
<!-- 定义了一个泳道 --> <swimlane name="sales representative" candidate-groups="sales-dept" /> <!-- 在一个task中,使用某个预定义好的泳道 --> <task name="enter order data" swimlane="sales representative"> <transition to="calculate quote"/> </task>
可以为分配人提供一个提醒, 当一个任务添加到他们的列表时,以及在特定的时间间隔进行提醒。 每个email信息都是根据一个模板生成出来的。模板可以在内部指定, 或者在配置文件中的 process-engine-context
部分指定。
sub-process子流程
custom
mail