使用JBPM工作流引擎测试的一个例子

开发 后端
本文举出了了一个使用jBPM工作流引擎进行测试的例子。例子中使用一个Persistence用于存储全局变量值。从使用流程设计器创建流程规则,直到最后参与者参与者执行审批操作,触发流程流转到下一个环节,本例中都提供了完整的代码以供参考。

本文提供使用jBPM工作流引擎测试的一个例子。

提供一个Persistence,用于存储全局的变量值,方便存储和获取

  1. public class Persistence {  
  2. private static Map variables = null;  
  3. private static String tmpfile = System.getProperty("java.io.tmpdir") + "/temp.object";  
  4. static{  
  5. //加载文件  
  6. try{  
  7. if(new File(tmpfile).exists()){  
  8. FileInputStream in = new FileInputStream(tmpfile);  
  9. ObjectInputStream s = new ObjectInputStream(in);   
  10.     variables = (Map)s.readObject();  
  11. }  
  12. if(variables == null){  
  13. variables = new HashMap();  
  14. }  
  15. }catch(Exception e){  
  16. e.printStackTrace();  
  17. }  
  18. }  
  19. //设置一个变量的值  
  20. public static void setVariable(String name,Serializable object){  
  21. if(variables != null){  
  22. variables.put(name, object);  
  23. }  
  24. try {  
  25. FileOutputStream fos = new FileOutputStream(tmpfile);  
  26. ObjectOutputStream oos = new ObjectOutputStream(fos);  
  27. oos.writeObject(variables);  
  28. oos.flush();  
  29. oos.close();  
  30. fos.flush();  
  31. fos.close();  
  32. catch (Exception e) {  
  33. e.printStackTrace();  
  34. }  
  35. }  
  36. //获取一个变量的值  
  37. public static Serializable getVariable(String name){  
  38. if(variables != null){  
  39. return (Serializable)variables.get(name);  
  40. }  
  41. return null;  
  42. }  
  43. }  
  44.  

1.首先使用流程设计器,创建一个简单的流程规则

流程规则 

2.创建数据库表,创建流程定义对象,并部署流程定义

  1. //创建数据库表  
  2. public class Jbpm_01_CreateTable extends TestCase {  
  3. public void testCreateTable(){  
  4. JbpmConfiguration.getInstance().createSchema();  
  5. }  
  6. }  
  7. //定义流程定义对象,并部署流程  
  8. public class Jbpm_02_DeployProcessDefinition extends TestCase {  
  9. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  10. public void testDeployProcessDefinition(){  
  11. //读取流程定义文件,得到流程定义对象  
  12. ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("test01/processdefinition.xml");  
  13. //可以得到流程定义的名称  
  14. Persistence.setVariable("processName", processDefinition.getName());  
  15. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  16. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  17. try{  
  18. context.deployProcessDefinition(processDefinition);  
  19. }catch(Exception e){  
  20. e.printStackTrace();  
  21. context.setRollbackOnly();  
  22. }finally{  
  23. context.close();  
  24. }  
  25. }  
  26. }  
  27.  

3.定义公文Doucment 及其映射文件Doucment.hbm.xml

  1. public class Document {  
  2. private int id;  
  3. private String title;  
  4. private String content;  
  5. private Long processInstanceId;  
  6. public String getContent() {  
  7. return content;  
  8. }  
  9. public void setContent(String content) {  
  10. this.content = content;  
  11. }  
  12. public int getId() {  
  13. return id;  
  14. }  
  15. public void setId(int id) {  
  16. this.id = id;  
  17. }  
  18. public Long getProcessInstanceId() {  
  19. return processInstanceId;  
  20. }  
  21. public void setProcessInstanceId(Long processInstanceId) {  
  22. this.processInstanceId = processInstanceId;  
  23. }  
  24. public String getTitle() {  
  25. return title;  
  26. }  
  27. public void setTitle(String title) {  
  28. this.title = title;  
  29. }  
  30. }  
  31. //Document映射文件Document.hbm.xml  
  32. <hibernate-mapping>  
  33.   <class table="tbl_document" name="Document">  
  34.     <id name="id">  
  35.       <generator class="native"/>  
  36.     </id>  
  37.     <property name="title"/>  
  38.     <property name="content"/>  
  39.     <property name="processInstanceId"/>  
  40.   </class>  
  41. </hibernate-mapping>  
  42.  

4.创建公文并与流程实例绑定

  1. public class Jbpm_03_CreateDocument extends TestCase {  
  2.  
  3. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  4.  
  5. public void testCreateDocument(){  
  6.  
  7. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  8.  
  9. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  10.  
  11. try{  
  12.  
  13. Document doc = new Document();  
  14.  
  15. doc.setTitle("测试公文"+new Random().nextInt(9999));  
  16.  
  17. context.getSession().save(doc);  
  18.  
  19. Persistence.setVariable("docId", doc.getId());  
  20.  
  21. }catch(Exception e){  
  22.  
  23. e.printStackTrace();  
  24.  
  25. context.setRollbackOnly();  
  26.  
  27. }finally{  
  28.  
  29. context.close();  
  30.  
  31. }  
  32.  
  33. }  
  34.  
  35. }  
  36.  

5.提交公文到流程,触发流程流转

  1. public class Jbpm_05_SubmitDocument extends TestCase {  
  2.  
  3. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  4.  
  5. //提交公文到第一个环节  
  6.  
  7. public void testSubmitDocument(){  
  8.  
  9. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  10.  
  11. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  12.  
  13. try{  
  14.  
  15. //已知公文的信息  
  16.  
  17. int docId = (Integer)Persistence.getVariable("docId");  
  18.  
  19. Document doc = (Document)context.getSession().load(Document.class, docId);  
  20.  
  21. long processInstanceId = doc.getProcessInstanceId();  
  22.  
  23. ProcessInstance processInstance = context.getProcessInstance(processInstanceId);  
  24.  
  25. //触发流程实例流转到下一个环节  
  26.  
  27. processInstance.signal();  
  28.  
  29. }catch(Exception e){  
  30.  
  31. e.printStackTrace();  
  32.  
  33. context.setRollbackOnly();  
  34.  
  35. }finally{  
  36.  
  37. context.close();  
  38.  
  39. }  
  40.  
  41. }  
  42.  
  43. }  
  44.  

6.查看公文所处的当前任务节点

  1. public class Jbpm_06_CurrentNode extends TestCase {  
  2.  
  3. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  4.  
  5. //公文当前所处的环节  
  6.  
  7. public void testCurrentNode(){  
  8.  
  9. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  10.  
  11. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  12.  
  13. try{  
  14.  
  15. //已知公文的信息  
  16.  
  17. int docId = (Integer)Persistence.getVariable("docId");  
  18.  
  19. Document doc = (Document)context.getSession().load(Document.class, docId);  
  20.  
  21. long processInstanceId = doc.getProcessInstanceId();  
  22.  
  23. ProcessInstance processInstance = context.getProcessInstance(processInstanceId);  
  24.  
  25. String currentNode = processInstance.getRootToken().getNode().getName();  
  26.  
  27. System.err.println("公文【"+doc.getTitle()+"】当前所处的环节" +  
  28.  
  29. "是:"+currentNode+",流程实例是否已结束?"+processInstance.hasEnded());  
  30.  
  31. }catch(Exception e){  
  32.  
  33. e.printStackTrace();  
  34.  
  35. context.setRollbackOnly();  
  36.  
  37. }finally{  
  38.  
  39. context.close();  
  40.  
  41. }  
  42.  
  43. }  
  44.  
  45. }  
  46.  

7.获取流转个某个参与者处待处理的任务列表

  1. public class Jbpm_07_SearchMyTaskList extends TestCase {  
  2.  
  3. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  4.  
  5. //搜索流转到某个参与者手上的公文列表  
  6.  
  7. public void testSearchMyTaskList(){  
  8.  
  9. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  10.  
  11. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  12.  
  13. try{  
  14.  
  15. printTask(context,"张三");  
  16.  
  17. printTask(context,"李四");  
  18.  
  19. printTask(context,"王五");  
  20.  
  21. }catch(Exception e){  
  22.  
  23. e.printStackTrace();  
  24.  
  25. context.setRollbackOnly();  
  26.  
  27. }finally{  
  28.  
  29. context.close();  
  30.  
  31. }  
  32.  
  33. }  
  34.  
  35. private void printTask(JbpmContext context,String actorId){  
  36.  
  37. List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);  
  38.  
  39. for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {  
  40.  
  41. TaskInstance ti = (TaskInstance) iter.next();  
  42.  
  43. Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("documnt");  
  44.  
  45. Document doc = (Document)context.getSession().load(Document.class, docId);  
  46.  
  47. System.err.println("正在等待【"+actorId+"】审批的公文是:"+doc.getTitle());  
  48.  
  49. }  
  50.  
  51. }  
  52.  
  53. }  
  54.  

8.参与者执行审批操作,触发流程流转到下一个环节

  1. public class Jbpm_08_NextNode extends TestCase {  
  2.  
  3. static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
  4.  
  5. //从一个TaskNode的中间节点出发,触发流程流转到下一个环节  
  6.  
  7. public void testNextNode(){  
  8.  
  9. //JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作  
  10.  
  11. JbpmContext context = jbpmConfiguration.createJbpmContext();  
  12.  
  13. try{  
  14.  
  15. //*******************************************  
  16.  
  17. //某某用户要将其手上的某某公文提交到下一个环节  
  18.  
  19. //*******************************************  
  20.  
  21. //已知要提交的公文  
  22.  
  23. Integer docId = (Integer)Persistence.getVariable("docId");  
  24.  
  25.    
  26.  
  27.                     nextStep(context,"张三",docId);  
  28.  
  29.                     nextStep(context,"李四",docId);  
  30.  
  31. nextStep(context,"王五",docId);  
  32.  
  33.    
  34.  
  35. }catch(Exception e){  
  36.  
  37. e.printStackTrace();  
  38.  
  39. context.setRollbackOnly();  
  40.  
  41. }finally{  
  42.  
  43. context.close();  
  44.  
  45. }  
  46.  
  47. }  
  48.  
  49. private void nextStep(JbpmContext context,String actorId,Integer docId){  
  50.  
  51. List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);  
  52.  
  53. for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {  
  54.  
  55. TaskInstance ti = (TaskInstance) iter.next();  
  56.  
  57. Integer _docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("documnt");  
  58.  
  59. //找到对应的任务实例  
  60.  
  61. if(docId.equals(_docId)){  
  62.  
  63. Document doc = (Document)context.getSession().load(Document.class, docId);  
  64.  
  65. //参与者的任务已经处理完成,需要结束这个任务实例  
  66.  
  67. //这个动作,在缺省的情况下,会触发对应的Token的signal()方法,即流向下一个环节  
  68.  
  69. ti.end();  
  70.  
  71. System.err.println("公文【"+doc.getTitle()+"】已被【"+actorId+"】审批完成,已提交到下一个环节");  
  72.  
  73. }  
  74.  
  75. }  
  76.  
  77. }  
  78.  
  79. }  
  80.  

【编辑推荐】

  1. jBPM 3.2用户指南 概览
  2. jBPM 4.0.0用户指南 安装配置
  3. jBPM数据库表说明:流程节点表
  4. J2EE工作流管理系统jBPM详解(一)
  5. J2EE工作流管理系统jBPM详解(二) 
责任编辑:yangsai 来源: 163博客
相关推荐

2009-06-11 14:43:34

jbpm工作流引擎jBPM搭建

2011-12-14 09:58:58

JavajBPM

2009-06-11 14:33:11

jbpm工作流引擎什么是jbpm

2021-10-14 11:34:05

技术工作流引擎

2021-03-05 07:47:07

工作流引擎节点

2015-07-14 09:26:28

微型工作流引擎设计

2023-01-04 08:02:16

工作流架构设计

2023-07-05 09:48:44

Activiti部署

2023-08-02 18:48:23

Flowable工作流引擎

2009-09-01 18:26:23

C#工作流引擎

2024-10-17 08:39:32

2021-03-12 06:44:09

Argo Workfl开源项目

2009-06-18 15:53:37

Hibernate B

2023-03-14 08:02:14

静态路由动态路由设备

2024-01-25 11:41:00

Python开发前端

2024-01-08 13:40:00

并发安全• 数量

2021-12-17 08:39:39

SpringbootActiviti网关路由

2014-07-31 17:03:12

2022-02-25 17:02:38

自动化工作转型

2013-09-29 17:13:59

PowerShell工作流
点赞
收藏

51CTO技术栈公众号