0
点赞
收藏
分享

微信扫一扫

Jbpm3.2 开发一个Hello World程序


    这是一个超级简单的请假流程,只是为了学习,其他的我就不说了直接开始了。

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 字段是这些变量的读写权限
 

 

 

举报

相关推荐

0 条评论