这是一个超级简单的请假流程,只是为了学习,其他的我就不说了直接开始了。
1.定义 流程processdefinition.xml
processdefinition.xml,这个是一个关键文件。具体内容如下:
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="" name="JbpmHelloWorld"> <start-state name="request"> <task> <controller> <variable name="name" /> <variable name="day" /> <variable name="note" /> </controller> </task> <transition name="to_confirm" to="confirm"> <action name="requestAction" class="com.worldunion.handler.RequestAction"/> <reason>我要请假</reason> </transition> </start-state> <state name="confirm"> <transition name="to_end" to="end"> <action name="finishAction" class="com.worldunion.handler.ConfirmAction"></action> </transition> </state> <end-state name="end"></end-state> </process-definition>
processdefinition.xml文件相关标签说明:
说明:
流程的名称改成了 helloworld 。(呵呵,也就是这里和 helloworld 有关了)
<controller> 标签定义了三个数据:姓名、请假天数、说明。
<transition> 标签定了 request 节点的一个流程转向,这里是转到 confirm 节点。
<action> 标签定义了流程由一个节点转到另一个节点时,所要执行的动作,动作封装在一个
ActionHandler 类中。比如这里当 request 到 confirm 结点时将执行 RequestAction 类的 execute 方法。
RequestAction 下面还有一个 <reason> (请假理由),它对应于 FinshAction 的属性 String reason 。
例如:
private String reason; public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; }
流程文件对应的流程图如下:
ConfirmAction,具体代码如下:
package com.worldunion.handler; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; public class RequestAction implements ActionHandler { private String reason; public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } /** * 请求 */ @Override public void execute(ExecutionContext context) throws Exception { context.getContextInstance().setVariable("note", reason); } }
说明:
ExecutionContext 是一个贯通流程的容器,他是个大宝箱,里面啥玩意都有,后面将更深入的提到。这里的reasion就是processdefinition.xml中的我要请假。
package com.worldunion.handler; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; /** * 批准 * @author Administrator * */ public class ConfirmAction implements ActionHandler { @Override public void execute(ExecutionContext context) throws Exception { context.getContextInstance().setVariable("note", "准假"); } }
到了这里,后台的程序基本写完了,下面开始对流程进行部署,用前面提到的方法如下:
package com.worldunion.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import junit.framework.TestCase; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.graph.def.ProcessDefinition; /** * 部署processdefinition.xml文件 * @author Administrator */ public class DeployProcessTest extends TestCase { public void testDeployProcessDefinition() throws FileNotFoundException{ //从jbpm.cfg.xml取得jbpm的配置 JbpmConfiguration config = JbpmConfiguration.getInstance(); //创建jbpm容器 JbpmContext jbpmContext = config.createJbpmContext(); InputStream is = new FileInputStream("processes/JbpmHelloWorld/processdefinition.xml"); ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is); //利用容器的方法将流程定影部署到数据上 jbpmContext.deployProcessDefinition(processDefinition); //关闭jbpmContext jbpmContext.close(); } }
运行此程序看是否成功,在这里我的是可以的,我们继续了。
我慢来看看jbpm数据相关表:如下图
并由此简单判断出各表的作用,表中各字段的作用由字段名也能知晓一二。
jbpm_processdefinition : 一个流程定义文件对应一条记录,可记录多个流程定义文件,可记录一个流程定义文件的对个版本。
jbpm_action : 记录 ActionHandler 的对象实例(以名称为标识)
jbpm_delegation : 记录了 ActionHandler 全类名,以便于用反射方式来加载
jbpm_envent : 它的 transition 引用了 Jbpm_transition 表的 id ,再看其它字段,估计此表是表示流程转向事件的一个实例,或者是一个各表之间的联接表。
jbpm_node : 流程结点
jbpm_transition : 流程的转向定义
jbpm_variableaccess : 流程中携带的变量。 ACCESS 字段是这些变量的读写权限