jbpm笔记.doc_第1页
jbpm笔记.doc_第2页
jbpm笔记.doc_第3页
jbpm笔记.doc_第4页
jbpm笔记.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JBPM 其实就是一个流转引擎,他可以存储和处理从一个节点到另一个节点所要做的一些事情定义好了流程:接下来就可以按照流程去跑流程接下来要学习的就是这么设计一个流程创建一个公文,怎么提交一个公文,怎么查看待审公文,怎么审批。1. 从一个简单的例子开始。第一步:新建一个流程图设计好流程 第二步:定义任务(谁要做什么事情),所以我们要给tasknode加task两个要点:任务有什么要做,由谁来做。 表示任务是请假审批,由soap来做。 注意:一个task-node中也可以有多个任务:例如: 第三步:部署流程所谓部署流程就是把流程定义持久化到数据库里面。1. 配置hibernate环境,引入sql2000的驱动修改好默认的hibernate配置文件,改成sql2000数据库,注意只改jdbc信息其他的不要动。2.创建对应的数据库手动使用hibernate自动生成表public class CreateTable public static void main(String args) / TODO Auto-generated method stubJbpmConfiguration.getInstance().createSchema();/自动读取hibernate文件,然后创建数据库表运行结果:自动创建好的33张数据库表如下:JBPM的数据库环境就配置好了3.创建流程定义对象,把流程并保存到数据库中package org.util;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;public class TestDeployProcessDefinition /* * param args */static JbpmConfiguration jc = JbpmConfiguration.getInstance();public static void main(String args) / TODO Auto-generated method stubProcessDefinition def = ProcessDefinition.parseXmlResource(test01/processdefinition.xml);/流程定义内存化JbpmContext context = jc.createJbpmContext();/得到Jbpm上下文try context.deployProcessDefinition(def);/通过jbpm上下文对象保存流程到数据库中。 catch (Exception e) / TODO: handle exceptionSystem.out.println(持久化出错,回滚);context.setRollbackOnly();finallycontext.close();/这段代码不写是提交了不了操作的运行上述代码,我们可以在数据库看到一些数据库被插入,实际上就是把图里的信息存放到了数据库中:第四步:创建公文这一步就需要创建一个业务对象,比如请假单。思路:把请假单(业务单据)的id放到流程实例变量里面,这样id就会随着流程定义的路径进行流转。并通过actor-id得到相应的人来处理。步骤:1. 创建公文2. 创建流程实例3. 流程实例和公文进行绑定。例子:创建公文实体类:public class Document private int id;private String title;private String content;private long processInstanceId;public String getContent() return content;public void setContent(String content) this.content = content;public i。 update/property package org.util;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;public class Test2CreateDocument static JbpmConfiguration jc = JbpmConfiguration.getInstance();/创建公文public static void main(String args) JbpmContext context = jc.createJbpmContext();try /创建公文对象Document doc = new Document();doc.setTitle(测试公文+new Random().nextInt(9999);context.getSession().save(doc);/保存公文/创建流程实例对象/1.首先从数据库中加载processDefinition对象ProcessDefinition def= context.getGraphSession().findLatestProcessDefinition(test01);/2.根据ProcessDefinition对象创建流程实例ProcessInstance instance = new ProcessInstance(def);/3.保存这个具体的一次流程实例(比如某员工的一次请假流程)context.save(instance);/绑定公文对象和流程实例对象doc.setProcessInstanceId(instance.getId();/给我们自己公文设置流程实例的idinstance.getContextInstance().setVariable(documentId, doc.getId();/把一个值绑定到流程上下文,进行流转 catch (Exception e) / TODO: handle exceptionSystem.out.println(出错 回滚);context.setRollbackOnly();finallycontext.close();/这段代码不写是提交了不了操作的运行上述代码后来看看数据库表:公文表里有一张公文了instance.getContextInstance().setVariable(documentId, doc.getId();第五步:提交公文,查看当前节点目前我的流程还在起点,但是如果提交了的话就会流转到rouch这里已知的是公文,上一步我们已经把公文绑定到了流程实例中,根据公文可以得到流程实例,调用package org.util;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;public class Test3SubmitDocument static JbpmConfiguration jc = JbpmConfiguration.getInstance();/创建公文public static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知公文id=2int documentId=2;Document doc =(Document)context.getSession().get(Document.class, documentId); /得到公文对应的流程实例对象long processInstanceId = doc.getProcessInstanceId();ProcessInstance instance = context.getProcessInstance(processInstanceId);/将公文提交到下一个环节instance.signal(); catch (Exception e) / TODO: handle exceptionSystem.out.println(出错 回滚);context.setRollbackOnly();finallycontext.close();这样的话流程就跑到了rouch哪里去了,调用了signal()方法这个方法只能执行一次,因为在执行一次就到下一个节点去了。写一个方法来查看一下当前节点到了哪里package org.util;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;public class Test4CurrentNode static JbpmConfiguration jc = JbpmConfiguration.getInstance();/查看公文当前所处的环节是什么public static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知公文id=2int documentId=2;Document doc =(Document)context.getSession().get(Document.class, documentId); /得到公文对应的流程实例对象long processInstanceId = doc.getProcessInstanceId();ProcessInstance instance = context.getProcessInstance(processInstanceId);/查看当前节点位置String nodename = instance.getRootToken().getNode().getName();System.out.println(nodename); catch (Exception e) / TODO: handle exceptionSystem.out.println(出错 回滚);context.setRollbackOnly();finallycontext.close();第六步:用户查询待审公文还是接着查询上面的例子。就是说目前是rouch来审,那么rouch如果登入的系统的话,就可以查到自己的待审公文。package org.util;import java.util.List;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.taskmgmt.exe.TaskInstance;public class Test5SearchTestList static JbpmConfiguration jc = JbpmConfiguration.getInstance();/查看公文当前所处的环节是什么public static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知公文id=2printTask(context,rouch); catch (Exception e) / TODO: handle exceptionSystem.err.println(出错 回滚);context.setRollbackOnly();finallycontext.close();public static void printTask(JbpmContext context,String name)List tasks= context.getTaskMgmtSession().findTaskInstances(name);System.out.println(tasks.size();for (TaskInstance instance : tasks) Integer i = (Integer)instance.getProcessInstance().getContextInstance().getVariable(documentId);System.err.println(docmentid:+i);注意:这里sql2000可能是会报错的,Cant start a cloned connection while in manual transaction mode错误,原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用默认的模式.direct (SelectMethod=direct) 模式解决办法当你使用手动事务模式时,必须把SelectMethod 属性的值设置为 Cursor, 或者是确保在你的连接只有一个STATEMENT操作。修改url加入SelectMethod=cursor即可如:jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=ys;SelectMethod=Cursor. 第七步:中间环节的审批后继续提交中间环节不能直接用signal方法,使用signal方式完全可以使指向到下一个节点,但是,我们要做到的效果是之前审批过的人就看不了,而直接调用signal方法,只能流到下一个节点,但是不能关闭之前审批过的人。所以signal只适合第一个start节点流到下一个节点。package org.util;import java.util.List;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.taskmgmt.exe.TaskInstance;public class Test6NextNode static JbpmConfiguration jc = JbpmConfiguration.getInstance();/中间节点的审批流转public static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知公文id=2nextNode(context,rouch,2); catch (Exception e) / TODO: handle exceptionSystem.err.println(出错 回滚);context.setRollbackOnly();finallycontext.close();public static void nextNode(JbpmContext context,String actor_id,int documentId)List tasks= context.getTaskMgmtSession().findTaskInstances(actor_id);for (TaskInstance instance : tasks) Integer i = (Integer)instance.getProcessInstance().getContextInstance().getVariable(documentId);System.err.println(docmentid:+i);if(i.equals(documentId)/缺省情况调用taskInstance中的end方法,有两个目的/1.结束taskInstance对象/2.触发当前token对象的signal方法,使得流程往下流转instance.end();Document doc = (Document)context.getSession().get(Document.class, i);System.err.println(actor_id+对 +doc.getTitle()+审批完毕,到下一节点);查看当前审批:总结:到这里我们就等于跑完了一个流程了。2. 会签操作Fork和join创建jbpm02一个操作提交给多个用户,多个用户需要都同意才能继续往下。那么要使用fork进行分支,再使用join对分支进行整合。我们把流程定义文件写成如下修改流程名称: 接下来就可以流转这个流程。1.我们直接从开始运行,因为我们从新定义了流程文件需要从先部署流程。2.创建公文:运行得到可以查看一下公文处在哪个节点4. 提交公文,提交到第一个环节查看当前节点:5. 看看rouch手上是不是有这个4号文档发现rouch手上确实有这个文档。6. 接下来rouch审批这个文档通过下一个节点为fork节点,也就是领导审批节点7. 然后soap,price审批列表里都会出现这个待审公文,需要两个人都审核通过了才能到下一个节点去8. 最后就到endi里去了3.如何从start得知下一步可选路径列表如果有多个可选的提交下一步的话我们需要打印出可选列表让客户选择。创建项目jbpm03修改审批流程package org.util;import java.util.List;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.def.Transition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.taskmgmt.exe.TaskInstance;public class Test7SearNextTransitions static JbpmConfiguration jc = JbpmConfiguration.getInstance();/从起点出发,有哪些可供选择的transitionpublic static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知用户和他要提交的公文int docid = 10;Document doc= (Document)context.getSession().get(Document.class, docid);long processInstanceId = doc.getProcessInstanceId();ProcessInstance instance = context.getProcessInstance(processInstanceId);List list = instance.getRootToken().getNode().getLeavingTransitions();for (Transition transition : list) System.err.println(doc.getTitle()+公文的下一个可选路径:+transition.getName(); catch (Exception e) / TODO: handle exceptionSystem.err.println(出错 回滚);context.setRollbackOnly();finallycontext.close();然后我们提交公文系统就会随机选择一个进行审批我们看到rouch拿到了10,这个是随机的,也有可能是soap拿到接下的问题就是我如何指定我要留转到哪一个呢。我们再次创建一个公文/将公文提交到下一个环节,指定走soap路线,填写transition名称instance.signal(提交soap审批);运行一下:然后查看一下:现在谁拥有的文档12,运行这个时候soap。4.根据条件选择下一步建立jbpm04比如假象一种情况就是,如果请假三天给rouch,请假1个星期就只能给soap的话。在创建公文的时候我们需要给days设置值注意还没有完,因为这个时候只要我们提交给了不符合条件的路径还是会有异常。所以我们先要得到符合条件的列表在把原先的改成:得到符合条件的路径这样的话的提供了可用的下一步路经选择,用户就可以避免异常发生。/将公文提交到下一个环节,指定走soap路线instance.signal(提交soap审批);5.从中间节点得到下一步可选列表注意:从中间节点的情况和上面讲到的又不一样。创建jbpm05package org.util;import java.util.List;import java.util.Random;import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.def.Transition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.taskmgmt.exe.TaskInstance;public class Test8SearNextTransitionsFormOther static JbpmConfiguration jc = JbpmConfiguration.getInstance();/从中间节点出发,有哪些可供选择的transitionpublic static void main(String args) JbpmContext context = jc.createJbpmContext();try /已知用户和他要提交的公文int docid = 10;Document doc = (Document)context.getSession().get(Document.class, docid);String actor=;List tasks= context.getTaskMgmtSession().findTaskInstances(actor);for (TaskInstance instance : tasks) Integer i = (Integer)instance.getProcessInstance().getContextInstance().getVariable(documentId);System.err.println(docmentid:+i);if(i.equals(docid)List nextTransition=instance.getAvailableTransitions();for (Transition transition : nextTransition) System.err.println(doc.getTitle()+:+actor+:下一个可选步骤+transition.getName(); catch (Exception e) / TODO: handle exceptionSystem.err.println(出错 回滚);context.setRollbackOnly();finallycontext.close();6.给角色分配任务创建Complexjbpm01从第一节到第五节我们可以说还没有学习到核心的部分,基于角色的审批任务分配还没有提到。现在我就来说明这个问题。我可以注意到每个任务节点: Admin 都必须要有任务,而我们之前一直都是直接assignment给一个具体的用户而不是一个角色。建议一个类package org.handler;import java.util.ArrayList;import java.util.List;import org.hibernate.Session;import org.jbpm.graph.exe.ExecutionContext;import org.jbpm.taskmgmt.def.AssignmentHandler;import org.jbpm.taskmgmt.exe.Assignable;public class RoleAssinmentHandle implements AssignmentHandlerString rolename;public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception / TODO Auto-generated method stubif(rolename=null)throw new RuntimeException(您必须设置角色名称);Session session = executionContext.getJbpmContext().getSession();/* *有了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论