关闭

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

422人阅读 评论(0) 收藏 举报
分类:

本文提供使用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. }

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. }

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>

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

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

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

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

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

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

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

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

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

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:253440次
    • 积分:3129
    • 等级:
    • 排名:第11406名
    • 原创:8篇
    • 转载:322篇
    • 译文:0篇
    • 评论:11条
    文章分类
    最新评论