Activiti工做流的定義部署和執行

   

工做流引擎

    我的以爲直接理解工做流引擎概念有點難度,咱們能夠先經過了解工做流引擎的職責再反過來理解工做流引擎,工做流引擎通常都作兩件事情:java

    1.定義流程,也就是給咱們提供某種規範來定義規則,以及如何定義一個流程的這種規範,同事咱們能夠根據工做流引擎提供的相關概念來定義更爲複雜的流程,這就是工做流引擎作的第一件事叫作定義流程。mysql

    2.執行流程,也就是工做流引擎須要解釋這個規則,還要負責流程,它至關於流程的調度者,監控每一個流程的執行狀況,並將流程操做發往下一步,或者根據條件休眠或終止流程的這麼一個過程就叫作執行流程。sql

    瞭解完工做流引擎的這兩個職責,我相信對於什麼是工做流引擎必定已經有了必定的認識了,咱們在用一句稍微有點官方的話來總結一下工做流引擎,工做流引擎爲咱們提供相關規則概念的定義,給咱們提供了相關的API來調用這個引擎去執行流程。流程的操做實際上就是工做流引擎提供相關的api咱們去調用它。api

工做流框架與工做流引擎

    上面咱們說起了常見了幾個工做流框架,其中如今的Activiti和JBPM5.0以前的版本都是基於ProcessEngine 工做流引擎的工做流框架JBPM5.0開始是基於DroolsFlow爲工做流引擎的工做流框架;其中OSWorkflow是以工做流引擎命名的工做流框架,因此OSWorkflow是基於OSWorkflow工做流引擎的工做流框架;ActiveBPEL是基於工做流BPEL引擎的工做流框架…….架構

    到這裏關於工做流的相關概念就介紹完了,接下來咱們先了解一下咱們的主角activiti的前世此生。框架

Activiti前世此生

      Activiti 的創始人是  Tom Baeyens 說到Tom Baeyens 就不能不提他與jbpm的淵源。TomBaeyens 是 jBPM 的創始人,在 2002年,Tom Baeyens建立了基於狀態機原理的jBPM流程引擎。jBPM通過了JBoss和Redhat公司以後,發展到了 jBPM 4。因爲jBPM使用的是 GPL開源協議,而且與JBoss和Redhat公司的其餘產品線結合的愈來愈緊密,對jBPM在更普遍的範圍使用造成了阻礙。JBoss內部對jBPM將來版本的架構實現產生了嚴重的意見分歧在2005年 Tom Baeyens離開了JBoss公司加入了Alfresco 公司,建立了使用Apache based-license V2的、獨立於Alfresco產品的開源流程產品Activiti 。Activiti在2010年3月份開始啓動,到了2010年12月份正式發佈第一個版本,新的基於jBPM4的開源工做流系統Activiti 5.0  !因此說Activiti5是在jBPM 三、jBPM 4的基礎上發展而來的,是原jBPM 的延續ide

    整個Activiti的生命週期通過了以下的幾個步驟:1.流程部署 , 2.啓動流程實例 , 3.執行流程對象(一個流程實例包含多執行對象) , 4.完成整個流程網站

   以下就是具體代碼:this

package process;
import java.io.File;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipInputStream;spa

import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import com.mysql.fabric.xmlrpc.base.Data;

public class TestProcess {

    /***
    * 整個Activiti的生命週期通過了以下的幾個步驟:
    * 1.流程部署
    * 2.啓動流程實例   
    * 3.執行流程對象(一個流程實例包含多執行對象)
    * 4.完成整個流程
    */
    //流程引擎ProcessEngine對象 ,全部操做都要依賴流程引擎對象
    ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
    //由流程引擎建立各service
    RepositoryService repositoryService=processEngine.getRepositoryService();
    //建立運行時服務
    RuntimeService runtimeService=processEngine.getRuntimeService();
    //建立任務服務
    TaskService taskService=processEngine.getTaskService();
    //歷史任務相關的服務
    HistoryService historyService=processEngine.getHistoryService();
  //身份服務
  IdentityService identityService=processEngine.getIdentityService();
  //管理服務
  ManagementService managermentService=processEngine.getManagementService();

}

1:部署流程---bpmn方式

@Test
public void deploymenyProcessDefinition(){
  Deployment deployment=repositoryService//與流程定義和部署對象相關的service
         .createDeployment()//建立一個部署對象
         .name("activiti_Introduction")//添加部署的名稱
         .addClasspathResource("diagrams/simpleProcess/MyProcess.bpmn")//從classpath資源中加載文件,一次加載一個
          .deploy();//部署
      System.out.println("流程Id:"+deployment.getId());
      System.out.println("流程名稱:"+deployment.getName());
}

2:部署流程---zip方式

@Test
public void deploymenyProcessDefinition_zip(){
    InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/simpleProcess/MyProcess.zip");
    ZipInputStream zipInputStream=new ZipInputStream(in);
    Deployment deployment=repositoryService//與流程定義和部署對象相關的service
                 .createDeployment()//建立一個部署對象
                 .name("activiti_Introduction")//添加部署的名稱 activiti入門
                 .addZipInputStream(zipInputStream)
                 .deploy();//完成部署
    System.out.println("部署流程Id:"+deployment.getId());
    System.out.println("部署流程名稱:"+deployment.getName());
}

3:啓動流程實例

@Test
public void startProcessInstance(){
  //流程定義的key
  String processDedinitionKey="activiti_Introduction";
  ProcessInstance pi=runtimeService //與正在執行的流程實例和執行對象相關的service
                .startProcessInstanceByKey(processDedinitionKey);//經過key啓動流程實例,key對應***.bpmn文件中id的屬性值
  System.out.println("流程實例id:"+pi.getId());
  System.out.println("流程定義id:"+pi.getProcessDefinitionId());
}

4:查看流程

@Test
public void viewProcess(){
  //流程定義的key
  String deploymengId="801";
  List<String> list=repositoryService
             .getDeploymentResourceNames(deploymengId);

  String resourceName="";
  if(list!=null && list.size()>0){
    for(String name:list){
      if(name.indexOf(".png")>0){
        resourceName=name;
          }
       }
    }

  //獲取圖片的輸入流
  InputStream is=repositoryService
           .getResourceAsStream(deploymengId, resourceName);

  File file=new File("D:/"+resourceName);

  //將輸入流的圖片寫入到磁盤下
  //FileUtils.copy(is, file);

}

5:查看當前人的我的任務

@Test
public void findMyProcessTask(){
  String assignee="張三";
  List<Task> tasklist=taskService //與正在執行任務管理 相關的service
              .createTaskQuery()//建立任務查詢對象
              .taskAssignee(assignee)//指定我的任務查詢 指定辦理人
              .list();//返回結果集


  if(tasklist!=null && tasklist.size()>0){
    for(Task task:tasklist){
      System.out.println("任務Id:"+task.getId());
      System.out.println("任務 名稱:"+task.getName());
      System.out.println("任務的建立時間:"+task.getCreateTime());
      System.out.println("任務的辦理人:"+task.getAssignee());
      System.out.println("流程實例Id:"+task.getProcessInstanceId());
      System.out.println("流程執行對象Id:"+task.getExecutionId());
      System.out.println("流程定義Id:"+task.getProcessDefinitionId());
    }

  }
}

6:查詢流程定義

@Test
public void findProcessDefinition(){
  List<ProcessDefinition> proDefList=repositoryService//與流程定義和部署對象相關的service
                  .createProcessDefinitionQuery()//建立一個流程定義的查詢
                  .orderByProcessDefinitionVersion()//按照版本的升序排列
                  .list();//返回的結果集
  if(proDefList!=null && proDefList.size()>0){
    for(ProcessDefinition pd:proDefList){
      System.out.println("流程定義Id:"+pd.getId());
      System.out.println("流程定義名稱:"+pd.getName());
      System.out.println("流程定義的key:"+pd.getKey());
      System.out.println("流程定義的版本:"+pd.getVersion());
      System.out.println("資源名稱bpmn文件:"+pd.getResourceName());
      System.out.println("資源名稱png文件:"+pd.getDiagramResourceName());
      System.out.println("部署對象Id:"+pd.getDeploymentId());
    }
  }
}

7:刪除流程定義

@Test
public void deleteProcessDefinition(){
  String deploymentId="601";
  //不帶級聯刪除
  repositoryService.deleteDeployment(deploymentId);

  //級聯刪除
  repositoryService.deleteDeployment(deploymentId, true);

  System.out.println("刪除成功");
}

8:完成個人任務

@Test
public void completeMyProcess(){
  //任務Id
  String taskId="1201";
  taskService.complete(taskId);
  System.out.println("完成任務,任務Id爲:"+taskId);

}

9:查詢流程狀態 (判斷流程是正在執行仍是結束了)

@Test
public void isProcessEnd(){
  //正在執行的流程Id
  String processInstanceId="1001";
  ProcessInstance pi=runtimeService
             .createProcessInstanceQuery() //建立流程實例查詢
             .processInstanceId(processInstanceId)//使用流程實例id查詢
             .singleResult();
  if(pi==null){
    System.out.println("流程已結束");
  }else{
    System.out.println("流程還在執行中");
  }
}

10:查詢歷史任務

@Test
public void findHistoryTask(){
  String taskAssignee="";
  List<HistoricTaskInstance> hisList=historyService
              .createHistoricTaskInstanceQuery()//建立歷史任務實例查詢
              .taskAssignee(taskAssignee)//指定歷史任務的辦理人
              .list();
  if(hisList!=null && hisList.size()>0){
  for(HistoricTaskInstance hti:hisList){
    System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" ");
  }
 }
}

11:設置流程變量

@Test
public void setVariables(){
  //任務Id
  String taskId="2046";
  taskService.setVariableLocal(taskId, "請假天數", 3); //與任務ID綁定
  taskService.setVariable(taskId, "請假日期", new Data());
  taskService.setVariable(taskId, "請假緣由", "回家有事");
  System.out.println("設置流程變量成功");
}

12:獲取流程變量

@Test
public void getVarables(){
  //任務Id
  String taskId="2046";
  //獲取流程變量 使用基本數據類型
  Integer days=(Integer) taskService.getVariable(taskId, "請假天數");
  Date date=(Date) taskService.getVariable(taskId, "請假日期");
  String leaveReason= (String) taskService.getVariable(taskId, "請假緣由");
  System.out.println("請假天數:"+days+" 請假時間:"+date+" 請假緣由:"+leaveReason); }

相關文章
相關標籤/搜索