Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410601
  • 博文数量: 155
  • 博客积分: 2590
  • 博客等级: 少校
  • 技术积分: 2161
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-25 09:33
文章分类

全部博文(155)

文章存档

2015年(1)

2014年(2)

2013年(55)

2012年(97)

分类: Java

2012-11-03 13:55:08

@author YHC

 首先描述一下版本:

activiti:Activiti5.10

mysql:5.5(Activiti有规定最低版本是5.1.11)

mysql驱动:mysql-connector-java-5.1.17-bin.jar

spring:3.1.2(也就是Activiti自带的例子中的jar包)


该示例主要是从Activiti官网的10分钟入门中提取的.

流程图:

对应的XML文件:(FinancialReportProcess.bpmn20.xml)

  1. xml version="1.0" encoding="UTF-8" ?>  
  2. <definitions id="definitions"  
  3.     targetNamespace=""   
  4.   xmlns:activiti=""  
  5.   xmlns:bpmndi=""   
  6.   xmlns:omgdc=""  
  7.   xmlns:omgdi=""   
  8.     xmlns="">  
  9.       
  10.     <process id="financialReport" name="Monthly financial report process">  
  11.          
  12.         <startEvent id="theStart" />  
  13.           
  14.         <sequenceFlow id="flow1" sourceRef="theStart" targetRef="writeReportTask" />  
  15.           
  16.         <userTask id="writeReportTask" name="Write monthly financial report" >  
  17.           <documentation>  
  18.         Write monthly financial report for publication to shareholders.  
  19.       documentation>  
  20.       <potentialOwner>  
  21.         <resourceAssignmentExpression>  
  22.           <formalExpression>accountancyformalExpression>  
  23.         resourceAssignmentExpression>  
  24.       potentialOwner>  
  25.         userTask>  
  26.           
  27.         <sequenceFlow id="flow2" sourceRef="writeReportTask" targetRef="verifyReportTask" />  
  28.               
  29.         <userTask id="verifyReportTask" name="Verify monthly financial report" >  
  30.           <documentation>  
  31.         Verify monthly financial report composed by the accountancy department.  
  32.         This financial report is going to be sent to all the company shareholders.    
  33.       documentation>  
  34.       <potentialOwner>  
  35.         <resourceAssignmentExpression>  
  36.           <formalExpression>managementformalExpression>  
  37.         resourceAssignmentExpression>  
  38.       potentialOwner>  
  39.         userTask>  
  40.           
  41.         <sequenceFlow id="flow3" sourceRef="verifyReportTask" targetRef="theEnd" />  
  42.               
  43.         <endEvent id="theEnd" />  
  44.               
  45.     process>  
  46.   
  47.   
  48.   
  49.     <bpmndi:BPMNDiagram>  
  50.         <bpmndi:BPMNPlane bpmnElement="financialReport">  
  51.             <bpmndi:BPMNShape bpmnElement="theStart">  
  52.                 <omgdc:Bounds height="30.0" width="30.0" x="75.0" y="225.0" />  
  53.             bpmndi:BPMNShape>  
  54.             <bpmndi:BPMNShape bpmnElement="writeReportTask">  
  55.                 <omgdc:Bounds height="80.0" width="100.0" x="165.0" y="200.0" />  
  56.             bpmndi:BPMNShape>  
  57.             <bpmndi:BPMNShape bpmnElement="verifyReportTask">  
  58.                 <omgdc:Bounds height="80.0" width="100.0" x="330.0" y="200.0" />  
  59.             bpmndi:BPMNShape>  
  60.             <bpmndi:BPMNShape bpmnElement="theEnd">  
  61.                 <omgdc:Bounds height="28.0" width="28.0" x="480.0" y="226.0" />  
  62.             bpmndi:BPMNShape>  
  63.             <bpmndi:BPMNEdge bpmnElement="flow1">  
  64.         <omgdi:waypoint x="105.0" y="240.0" />  
  65.         <omgdi:waypoint x="165.0" y="240.0" />  
  66.       bpmndi:BPMNEdge>  
  67.             <bpmndi:BPMNEdge bpmnElement="flow2">  
  68.                 <omgdi:waypoint x="265.0" y="240.0" />  
  69.                 <omgdi:waypoint x="330.0" y="240.0" />  
  70.             bpmndi:BPMNEdge>  
  71.             <bpmndi:BPMNEdge bpmnElement="flow3">  
  72.                 <omgdi:waypoint x="430.0" y="240.0" />  
  73.                 <omgdi:waypoint x="480.0" y="240.0" />  
  74.             bpmndi:BPMNEdge>  
  75.         bpmndi:BPMNPlane>  
  76.     bpmndi:BPMNDiagram>  
  77.       
  78. definitions>  


接下来看以下对应spring和数据库的配置文件:(activiti.cfg.xml)
  1. xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns=""   
  4.        xmlns:context=""  
  5.        xmlns:tx=""  
  6.        xmlns:xsi=""  
  7.        xsi:schemaLocation="   /spring-beans.xsd  
  8.                             /spring-context-2.5.xsd  
  9.                                  /spring-tx-3.0.xsd">  
  10.   
  11.        
  12.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  13.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  14.         <property name="url" value="jdbc:mysql://localhost:3306/activiti" />  
  15.         <property name="username" value="root" />  
  16.         <property name="password" value="root" />  
  17.         <property name="defaultAutoCommit" value="true" />  
  18.     bean>  
  19.       
  20.       
  21.       
  22.     <bean id="transactionManager"  
  23.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  24.         <property name="dataSource" ref="dataSource" />  
  25.     bean>  
  26.   
  27.   
  28.     <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">  
  29.            
  30.           
  31.         <property name="databaseType" value="mysql">property>  
  32.         <property name="dataSource" ref="dataSource" />  
  33.         <property name="transactionManager" ref="transactionManager" />  
  34.         <property name="databaseSchemaUpdate" value="true" />  
  35.         <property name="jobExecutorActivate" value="false" />  
  36.            
  37.     bean>  
  38.   
  39.      
  40.     <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">  
  41.         <property name="processEngineConfiguration" ref="processEngineConfiguration" />  
  42.     bean>  
  43.   
  44.       
  45.     <bean id="repositoryService" factory-bean="processEngine"  
  46.         factory-method="getRepositoryService" />  
  47.     <bean id="runtimeService" factory-bean="processEngine"  
  48.         factory-method="getRuntimeService" />  
  49.     <bean id="taskService" factory-bean="processEngine"  
  50.         factory-method="getTaskService" />  
  51.     <bean id="historyService" factory-bean="processEngine"  
  52.         factory-method="getHistoryService" />  
  53.     <bean id="managementService" factory-bean="processEngine"  
  54.         factory-method="getManagementService" />  
  55.           
  56.        
  57.     <tx:annotation-driven transaction-manager="transactionManager"/>  
  58.       
  59.        
  60. beans>  
所需jar包均是从Activiti提供的Demo中的activiti-spring-examples项目libs-runtime下获取;


在测试的时候没有写junit单元测试,而是直接写的main方法.

  1. package org.activiti.test.financial;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.activiti.engine.HistoryService;  
  6. import org.activiti.engine.RepositoryService;  
  7. import org.activiti.engine.RuntimeService;  
  8. import org.activiti.engine.TaskService;  
  9. import org.activiti.engine.history.HistoricProcessInstance;  
  10. import org.activiti.engine.repository.Deployment;  
  11. import org.activiti.engine.runtime.ProcessInstance;  
  12. import org.activiti.engine.task.Task;  
  13. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  14.   
  15. public class FinancialTest {  
  16.     public static void main(String[] args) {  
  17.           
  18.         //在测试的时候没有使用junit  
  19.          ClassPathXmlApplicationContext applicationContext =   
  20.                 new ClassPathXmlApplicationContext("activiti.cfg.xml");  
  21.            
  22.          FinancialTest t=new FinancialTest();  
  23.          //step 1  部署  
  24.          //t.deploymentInstance(applicationContext);  
  25.          //step 2  启动流程实例  
  26.          //t.startInstance(applicationContext);  
  27.          //step 3 查询用户任务   
  28.           //t.queryUserTask(applicationContext);  
  29.          //step 4   分配任何给user   
  30.         // t.claimTask(applicationContext);  
  31.          //step 5    查询个人任务列表  
  32.          // t.queryPersonalTaskList(applicationContext);  
  33.          //step 6     完成任务  
  34.         // t.completePersonalTask(applicationContext);  
  35.          //step 7   查询历史流程信息  
  36.          //t.queryHistoryProcessInstance(applicationContext);  
  37.            
  38.     }  
  39.       
  40.       
  41.     //部署流程实例  
  42.     public void deploymentInstance(ClassPathXmlApplicationContext applicationContext){  
  43.         //获得repositoryService  
  44.         RepositoryService repositoryService = (RepositoryService) applicationContext.getBean("repositoryService");  
  45.         //从文件部署流程  
  46.         Deployment deployment = repositoryService.createDeployment()  
  47.           .addClasspathResource("org/activiti/test/financial/FinancialReportProcess.bpmn20.xml")  
  48.           .deploy();  
  49.           
  50.     }  
  51.       
  52.     //启动流程  
  53.     public void startInstance(ClassPathXmlApplicationContext applicationContext){  
  54.         //获得 runtimeservice对象  
  55.         RuntimeService runtimeService = (RuntimeService) applicationContext.getBean("runtimeService");  
  56.         //启动流程实例 ,注意这里的key是我们流程文件中的  
  57.         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");  
  58.           
  59.     }  
  60.       
  61.     //查询组任务  
  62.     public void queryUserTask(ClassPathXmlApplicationContext applicationContext){  
  63.         //获得 TaskService 对象  
  64.         TaskService taskService = (TaskService) applicationContext.getBean("taskService");  
  65.           
  66.         //查询任务列表使用组名称  
  67.         List tasks02 = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();  
  68.         for (Task task : tasks02) {  
  69.             System.out.println(task.getName());  
  70.         }  
  71.     }  
  72.       
  73.     //分配任务给用户  
  74.     public void claimTask(ClassPathXmlApplicationContext applicationContext){  
  75.         //获得TaskService对象  
  76.         TaskService taskService = (TaskService) applicationContext.getBean("taskService");  
  77.         //得到组任务,也可以是 management组  
  78.         List tasks02 = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();  
  79.         //任务分配之后这个任务就会从accountancy用户组的任务列表中消失  
  80.         for (Task task2 : tasks02) {  
  81.             taskService.claim(task2.getId(), "fozzie");  
  82.             System.out.println("任务名称:"+task2.getName());  
  83.         }  
  84.           
  85.         //此时查询fozzie人的个人任务列表  
  86.         List tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();  
  87.         for (Task t : tasks) {  
  88.             System.out.println("已受理任务名称:"+t.getName());  
  89.         }  
  90.           
  91.     }  
  92.       
  93.     //查询个人的任务列表  
  94.     public void queryPersonalTaskList(ClassPathXmlApplicationContext applicationContext){  
  95.         //获得TaskService对象  
  96.         TaskService taskService = (TaskService) applicationContext.getBean("taskService");  
  97.         //查询fozzie用户的个人任务列表  
  98.         List tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();  
  99.         //输出受理任务信息  
  100.         for (Task t : tasks) {  
  101.             System.out.println("已受理任务名称:"+t.getName());  
  102.         }  
  103.     }  
  104.       
  105.     //完成任务  
  106.     public void completePersonalTask(ClassPathXmlApplicationContext applicationContext){  
  107.         //获得TaskService对象  
  108.         TaskService taskService = (TaskService) applicationContext.getBean("taskService");  
  109.           
  110.         //查询 fozzie用户个人任务列表并完成其任务  
  111.         List tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();  
  112.           
  113.         //完成用户任务  
  114.         for (Task task : tasks) {  
  115.             System.out.println("完成任务名称:"+task.getName());  
  116.             //通过任务id完成任务  
  117.             taskService.complete(task.getId());   
  118.         }  
  119.           
  120.     }  
  121.       
  122.     //查询历史流程信息,也许你在查询的时候这个任务没有结束  
  123.     //那么请你将management组的任务claimTask分配给用户然后completePersonalTask完成任务  
  124.     //这个流程实例就算完成了,你在这里也才会查询出来,否则流程实例没有到达  
  125.     public void queryHistoryProcessInstance(ClassPathXmlApplicationContext applicationContext){  
  126.         //获取historyService  
  127.         HistoryService historyService = (HistoryService) applicationContext.getBean("historyService");  
  128.         //在这里需要注意的是,你的financialReport流程如果启动多个,singleResult将会出错  
  129.         //由于这里是测试我很清除这个实例只启动了一个,所以使用singleResult方法,如果你在测试时候需要注意  
  130.         HistoricProcessInstance historicProcessInstance =   
  131.         historyService.createHistoricProcessInstanceQuery().processDefinitionKey("financialReport").singleResult();//processInstanceId("financialReport").singleResult();  
  132.           
  133.         System.out.println("流程结束时间: " + historicProcessInstance.getEndTime());  
  134.     }  
  135.       
  136. }  


下面介绍一下Activiti提供的可视化测试的环境:

点击到页面上之后下载这一项:


1.解压文件

2.启动h2数据库,如下图:


3.启动tomcat,如下图


4.打开浏览器输入:

5.使用下面给出账户登录,如下图


6.部署一个新的流程,如下图操作:(请按照A,B顺序操作)


7.选择文件,如下图:


7.选择以下文件上传,如下图:(在7.1处描述文件位置)


7.1文件位置,如下图:


8.退出切换用户fozzie/fozzie登录



9.打开流程,选择流程,


10.启动此流程,注意:是紧接着上一步的操作:


11.查看任务,如下图


12.接受任务,如下图:



13,查看并完成任务,如下图


14.切换用户,kermit/kermit登陆.

15.查看任务.,如下图:


16.接受任务.如下图:


17.完成任务:如下图


18.确认是否有当前执行流程.来确认流程是否执行完毕.

阅读(1478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~