成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

activiti個(gè)人學(xué)習(xí)總結(jié)

hufeng / 2246人閱讀

摘要:事實(shí)也確實(shí)如此,可以配置數(shù)據(jù)庫(kù),其中存儲(chǔ)了流程運(yùn)行時(shí)的相關(guān)信息。在初學(xué)之時(shí),了解所有的數(shù)據(jù)庫(kù)表的含義對(duì)理解工作機(jī)制是有很大幫助的,總共涉及的表格總共有個(gè)通用數(shù)據(jù),用于存放數(shù)據(jù)。強(qiáng)行回顧了一下前兩天的學(xué)習(xí)歷程。

1、關(guān)于Activiti

初學(xué)activiti我關(guān)心的它是什么東西、有什么功能、怎么實(shí)現(xiàn)?
先來(lái)看一張流程圖感受一下:

activiti是一個(gè)業(yè)務(wù)流程管理引擎,它的流程圖大概就像是列車(chē)的軌道,而所要執(zhí)行的對(duì)象像是一輛自動(dòng)運(yùn)行的列車(chē),只要列車(chē)啟動(dòng),它就能沿著軌道一直走到終點(diǎn),而其中的節(jié)點(diǎn)就像是列車(chē)到達(dá)終點(diǎn)途中所要經(jīng)過(guò)的火車(chē)站,它會(huì)告訴火車(chē)下一站是哪里,然后火車(chē)就往指定的下一站駛?cè)?,直到終點(diǎn),流程結(jié)束。

如上所描述,最主要的功能就是實(shí)現(xiàn)了代碼的自動(dòng)按流程執(zhí)行

關(guān)于怎么實(shí)現(xiàn),既然這是一個(gè)框架,自然就是引進(jìn)jar包,畫(huà)流程圖,然后實(shí)現(xiàn)該框架提供的接口來(lái)做我們想要做的事情。

2、Activiti數(shù)據(jù)庫(kù)的理解

activiti在每個(gè)節(jié)點(diǎn)都能知道下一個(gè)節(jié)點(diǎn)是什么,以及當(dāng)前任務(wù)是什么,那勢(shì)必會(huì)有存儲(chǔ)流程的各種信息的表。事實(shí)也確實(shí)如此,activiti可以配置數(shù)據(jù)庫(kù),其中存儲(chǔ)了流程運(yùn)行時(shí)的相關(guān)信息。在初學(xué)Activiti之時(shí),了解activiti所有的數(shù)據(jù)庫(kù)表的含義對(duì)理解activiti工作機(jī)制是有很大幫助的,activiti總共涉及的表格總共有23個(gè):

act_ge_*:general通用數(shù)據(jù),用于存放數(shù)據(jù)。
act_re_*:reposity類(lèi)似于倉(cāng)庫(kù),存放流程定義文件和流程圖片文件,比如一個(gè)流程部署之后可以在act_re_deployment表中看到。
act_ru_*:run服務(wù)運(yùn)行時(shí)候的數(shù)據(jù),當(dāng)一個(gè)流程啟動(dòng)之后當(dāng)前的活動(dòng)任務(wù)可以在act_ru_task表格中查看 ,以及流程中所有的變量都保存在act_ru_variable表格當(dāng)中。

本來(lái)想寫(xiě)一系列完整的Activiti的學(xué)習(xí)筆記的,但是學(xué)完之后發(fā)現(xiàn)工作量著實(shí)不小,自身學(xué)的也不夠深,況且網(wǎng)上大有牛人有類(lèi)似的學(xué)習(xí)筆記,所以此文權(quán)當(dāng)是個(gè)人學(xué)習(xí)activiti的過(guò)程中填坑記錄,僅供參考; 3、運(yùn)行環(huán)境搭建,最簡(jiǎn)單的運(yùn)行環(huán)境(學(xué)習(xí)中用到了Junit 4用來(lái)測(cè)試很好用。),eclipse+jar包+mysql,配置文件,因?yàn)槲疫@里沒(méi)有與Spring整合,所以配置文件就一個(gè)activiti.cfg.xml放在class_path下面就好了。


    
    
        
        
        
        
        
        
    

4、下載畫(huà)流程工具activiti-app.war

從官網(wǎng)下載war包(登錄用戶(hù)密碼:admin test),找到activiti-app.war放進(jìn)tomcat,啟動(dòng)之后自己畫(huà)一個(gè)流程圖,用于下面的測(cè)試
war包下載:https://www.activiti.org/down...
版本6.xx的相關(guān)文檔都在這里:https://www.activiti.org/docs
版本5.xx的官網(wǎng)好像不再維護(hù)了
[畫(huà)圖工具]

5、開(kāi)始實(shí)現(xiàn)Activiti的一些api,并查看表格中的變化
package com.lewin.activiti.taskListener;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class DepolyTest {
    @Test
    public void run(){
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        Deployment deployment = processEngine.getRepositoryService()
                .createDeployment()
                //.addClasspathResource("taskListener.bpmn20.xml")
                .addClasspathResource("UserExecuteTask.bpmn20.xml")
                .deploy();
        String piid = deployment.getId();
        System.out.println("processDefinitionId:"+piid);
        //String processKey = "lewin";
        String processKey = "UserExecuteTask";
        ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processKey);
        System.out.println(pi.getId());
    }
    
    /**
     * 根據(jù)流程定義里的id啟動(dòng)流程實(shí)例
     */
    public void startInstance(){
        String processInstanceKey = "lewin";
        //“l(fā)ewin”即對(duì)應(yīng)著流程定義中的id值
        ProcessInstance pi = ProcessEngines.getDefaultProcessEngine()
                .getRuntimeService()
                .startProcessInstanceByKey(processInstanceKey);
        System.out.println("started processInstance id is:"+processInstanceKey+"; pi.id is:"+pi.getId());
    }
    
    /*
     * 從class_path中部署流程實(shí)例
     */
    @Test
    public void deploymentProcessDefinition_classpath(){
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        Deployment deployment = processEngine.getRepositoryService()//獲取倉(cāng)庫(kù)服務(wù)
                        .createDeployment()//創(chuàng)建部署實(shí)例
                        .name("deploymentName")//設(shè)置將要部署的流程實(shí)例的名稱(chēng)
                        .addClasspathResource("taskListener.bpmn20.xml")//資源文件:默認(rèn)路徑在class_path下面
                      //.addClasspathResource("diagrams/HelloWorld.png")
                        .deploy();//部署
        System.out.println("id:"+deployment.getId());
        System.out.println("name:"+deployment.getName());
        
    }
    
    /*
     * 查詢(xún)定義了的流程
     * 查詢(xún)內(nèi)容來(lái)自act_re_deployment
     */
    @Test
    public void findProcessDefinition(){
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        List list = processEngine.getRepositoryService()
                        .createProcessDefinitionQuery()
                        
                        //.deploymentId(deploymentId)
                        //.processDefinitionId(processDefinitionId)
                        //.processDefinitionKey(processDefinitionKey)
                        //.processDefinitionNameLike(processDefinitionNameLike)
                        
                       
                        .orderByProcessDefinitionVersion().asc()
                        //.orderByProcessDefinitionName().desc()
                        
                        .list();
                        //.singleResult();
                        //.count();
                        //.listPage(firstResult, maxResults)
        
        if(list != null && list.size()>0){
            for(ProcessDefinition processDefinition:list){
                System.out.println("ID:"+processDefinition.getId());
                System.out.println("NAME:"+processDefinition.getName());
                System.out.println("KEY:"+processDefinition.getKey());
                System.out.println("VERSION:"+processDefinition.getVersion());
                System.out.println("resourceName:"+processDefinition.getResourceName());
                System.out.println("圖片名字:"+processDefinition.getDiagramResourceName());
                System.out.println("部署的流程id:"+processDefinition.getDeploymentId());
                System.out.println("################################");
            }
        }
        
    }
    
    /*
     * 刪除流程定義
     */
    @Test
    public void deleteProcessDefinition(){
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //流程定義id
        String deploymentId = "2201";
        
        processEngine.getRepositoryService()
                        .deleteDeployment(deploymentId, true);
        
        System.out.println("刪除成功!");
    }
    
    /*
     * 查看流程定義圖并下載到本地
     */
    @Test
    public void viewPic() throws IOException{
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        /**流程部署id*/
        String deploymentId = "201";
        //根據(jù)id獲取存儲(chǔ)在act_re_deployment表里面的靜態(tài)資源,里面就有圖片
        List list = processEngine.getRepositoryService()//
                        .getDeploymentResourceNames(deploymentId);
        //獲取名字
        String resourceName = "";
        if(list!=null && list.size()>0){
            for(String name:list){
                if(name.indexOf(".png")>=0){
                    resourceName = name;
                }
            }
        }
        
        
        //獲取圖片資源
        InputStream in = processEngine.getRepositoryService()//
                        .getResourceAsStream(deploymentId, resourceName);
        
        //新建文件
        File file = new File("D:/"+resourceName);
        //文件復(fù)制
        FileUtils.copyInputStreamToFile(in, file);
    }
    
    /*
     * 刪除路程定義根據(jù)定義中的名字
     */
    @Test
    public void deleteProcessDefinitionByKey(){
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //流程定義文件中的名字,如果相同名字有多個(gè)默認(rèn)使用版本最高的那個(gè)
        String processDefinitionKey = "UserExecuteTask";
        List list = processEngine.getRepositoryService()
                        .createProcessDefinitionQuery()
                        .processDefinitionKey(processDefinitionKey)
                        .list();
        //刪除所有名字為UserExecuteTask的流程定義
        if(list!=null && list.size()>0){
            for(ProcessDefinition pd:list){
                //獲取ID
                String deploymentId = pd.getDeploymentId();
                processEngine.getRepositoryService()
                                .deleteDeployment(deploymentId);
            }
        }
    }
    
    /**
     * 查詢(xún)流程狀態(tài)
     */
    @Test
    public void queryInstanceState(){
        //流程id
        String instanceId = "1309";
        //任務(wù)id
        String taskId = "1312";
        //獲取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //通過(guò)流程id查詢(xún)狀態(tài)
        ProcessInstance pi = processEngine.getRuntimeService()
                .createProcessInstanceQuery()//創(chuàng)建查詢(xún)
                .processInstanceId(instanceId)//根據(jù)id
                .singleResult();//獲取狀態(tài)
        if(pi!=null){
            System.out.println("id為"+instanceId+"的流程正在進(jìn)行中......");
            //完成當(dāng)前節(jié)點(diǎn)
            processEngine.getTaskService().complete(taskId);
        }else{
            System.out.println("id為"+instanceId+"的流程已經(jīng)完成!");
        }
    }
    
    /**
     * 查詢(xún)流程執(zhí)行對(duì)象
     */
    @Test
    public void queryExecution(){
        //查詢(xún)執(zhí)行對(duì)象
        String exe = "User Task";
        //獲取流程實(shí)例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //查詢(xún)
        Execution e1 = processEngine.getRuntimeService()
                .createExecutionQuery()
                .processInstanceId("1509")
                .activityId(exe)
                .singleResult();
        if(e1!=null){
            System.out.println("e1!=null");
        }else{
            System.out.println("e1==null");
        }
    }
    
    /**
     * 根據(jù)用戶(hù)查詢(xún)?nèi)蝿?wù)
     */
    @Test
    public void queryUserTask(){
        
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // Fetch all tasks for the management group
        TaskService taskService = processEngine.getTaskService();
        List tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
        for (Task task : tasks) {
          System.out.println("Task available: " + task.getName());
        }
    }
    
    
}
6、例子1:只有用戶(hù)任務(wù)和并行網(wǎng)關(guān)的運(yùn)行

UserExecuteTask.bpmn20.xml文件:

  
  
   
      
       
        
        
     
     
      
      
      
         
            
         
      
      
         
            
         
      
      
            
            
         
      
      
      
         
            
         
      
      
      
          
             
          
      
      
      
      
      
      
      
      
      
      
      
      
      
    

測(cè)試代碼:
/**

     * 對(duì)應(yīng)UserExecuteTask.bpmn20.xml
     * 這是一個(gè)用戶(hù)任務(wù),所以流程完全執(zhí)行需要用戶(hù)的參與
     * 獲取所有任務(wù)
     * 
     */
    @Test
    public void getAllTasks(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取倉(cāng)庫(kù)實(shí)例
        Deployment deployment = processEngine.getRepositoryService()
                .createDeployment()
                .addClasspathResource("UserExecuteTask.bpmn20.xml")
                .deploy();
        //啟動(dòng)流程實(shí)例
        ProcessInstance pi = processEngine.getRuntimeService()
                .startProcessInstanceByKey("UserExecuteTask");
        System.out.println("pi.id:"+pi.getId());
        
        //第一輪(流程啟動(dòng)之后自動(dòng)進(jìn)入下一級(jí)節(jié)點(diǎn),
        //下一級(jí)節(jié)點(diǎn)為并行的三個(gè)任務(wù),獲取該三個(gè)任務(wù)依次按定義文件中順序完成) 
        TaskService taskService = processEngine.getTaskService();
        TaskQuery query = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();
        List tasks = query.list();
        //循環(huán)打印tasks的信息
        for(Task task : tasks){
            //執(zhí)行任務(wù)  ,完成任務(wù)
            taskService.complete(task.getId());  
            System.out.println("name ="+task.getName()); 
            System.out.println(tasks.size());
        }
            
        //第二輪查詢(xún)?nèi)蝿?wù):上一輪三個(gè)任務(wù)依次完成之后開(kāi)始進(jìn)入下一輪,第二級(jí)節(jié)點(diǎn)  
        tasks = query.list();
        //循環(huán)打印tasks的信息
          for(Task task : tasks){
              //執(zhí)行任務(wù)  ,完成任務(wù)
              taskService.complete(task.getId());  
              System.out.println("name ="+task.getName()); 
              System.out.println(tasks.size());
          }
          
        //第三輪查詢(xún)?nèi)蝿?wù):上一輪一個(gè)任務(wù)完成之后,開(kāi)始進(jìn)入下一級(jí)節(jié)點(diǎn),
          //即最后的人事部門(mén)審批  
        tasks = query.list();
        //循環(huán)打印tasks的信息
          for(Task task : tasks){
              //執(zhí)行任務(wù)  ,完成任務(wù)
              taskService.complete(task.getId());  
              System.out.println("name ="+task.getName()); 
              System.out.println(tasks.size());
          }
    }
    

運(yùn)行結(jié)果:

7、例子2:只有系統(tǒng)任務(wù)和并行網(wǎng)關(guān)的運(yùn)行

AutoUserExecuteTask.bpmn20.xml文件:

  
  
  
     
       
        
        
     
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
    
 

測(cè)試代碼:

/**
     * 對(duì)應(yīng)UserExecuteTask.bpmn20.xml
     * 這是一個(gè)自動(dòng)任務(wù)(不包含用戶(hù)任務(wù)),所以流程完全執(zhí)行不需要用戶(hù)的參與
     * 只需要啟動(dòng)實(shí)例,流程會(huì)自動(dòng)按流程走完
     * 獲取所有任務(wù)
     * 
     */
    @Test
    public void autoRun(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取倉(cāng)庫(kù)實(shí)例
        Deployment deployment = processEngine.getRepositoryService()
                .createDeployment()
                .addClasspathResource("AutoUserExecuteTask.bpmn20.xml")
                .deploy();
        //啟動(dòng)流程實(shí)例
        ProcessInstance pi = processEngine.getRuntimeService()
                .startProcessInstanceByKey("AutoUserExecuteTask");
        System.out.println("pi.id:"+pi.getId());
    }
    

運(yùn)行結(jié)果:

![圖片上傳中...]

8、例子3:只有用戶(hù)任務(wù)和排他網(wǎng)關(guān)的運(yùn)行

ExclusiveGatawayDemo.bpmn20.xml文件:



  
    ExclusiveGatawayDemo
    
      
      
    
    
    
      
        
      
    
    
    
    
    
      
        
      
    
    
      
        
      
    
    
    
    
    
      
    
    
      
    
  
  
    
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
      
      
        
        
      
      
        
        
      
      
        
        
        
      
      
        
        
      
      
        
        
        
      
      
        
        
      
    
  
 

測(cè)試代碼:

/**
     * 對(duì)應(yīng)ExclusiveGatewayDemo.bpmn20.xml
     * 包含排他網(wǎng)關(guān)的流程
     * 獲取所有任務(wù)
     * 
     */
    @Test
    public void exclusiveGatewayTasks(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取倉(cāng)庫(kù)實(shí)例
        Deployment deployment = processEngine.getRepositoryService()
                .createDeployment()
                .name("ExclusiveGatawayDemo_Deploymentname")
                .addClasspathResource("ExclusiveGatawayDemo.bpmn20.xml")
                .deploy();
        //啟動(dòng)流程實(shí)例
        ProcessInstance pi = processEngine.getRuntimeService()
                .startProcessInstanceByKey("ExclusiveGatawayDemo");
        System.out.println("pi.id:"+pi.getId());
        
        //第一輪(流程啟動(dòng)之后自動(dòng)進(jìn)入下一級(jí)節(jié)點(diǎn),
        //下一級(jí)節(jié)點(diǎn)為并行的三個(gè)任務(wù),獲取該三個(gè)任務(wù)依次按定義文件中順序完成) 
        TaskService taskService = processEngine.getTaskService();
        TaskQuery query = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();
        List tasks = query.list();
        //循環(huán)打印tasks的信息
        for(Task task : tasks){
            //執(zhí)行任務(wù)  ,完成任務(wù)
            taskService.complete(task.getId());  
            System.out.println("name ="+task.getName()); 
            System.out.println(tasks.size());
        }
        /**
         * userTask1完成,并且設(shè)置變量“myCondition”
         * 這里測(cè)試設(shè)置的值是"userTask3"
         * 按照定義應(yīng)該執(zhí)行userTask3
         * 注釋下面代碼的情況下,查詢(xún)act_ru_task可以查看到有userTask3任務(wù)
         * 不注釋的情況下,流程完成userTask1和userTask3走完整個(gè)流程
         */
            
        //第二輪查詢(xún)?nèi)蝿?wù):上一輪三個(gè)任務(wù)依次完成之后開(kāi)始進(jìn)入下一輪,第二級(jí)節(jié)點(diǎn)  
        tasks = query.list();
        //循環(huán)打印tasks的信息
          for(Task task : tasks){
              //執(zhí)行任務(wù)  ,完成任務(wù)
              taskService.complete(task.getId());  
              System.out.println("name ="+task.getName()); 
              System.out.println(tasks.size());
          }
          
        //第三輪查詢(xún)?nèi)蝿?wù):上一輪一個(gè)任務(wù)完成之后,開(kāi)始進(jìn)入下一級(jí)節(jié)點(diǎn),
          //即最后的人事部門(mén)審批  
        tasks = query.list();
        //循環(huán)打印tasks的信息
          for(Task task : tasks){
              //執(zhí)行任務(wù)  ,完成任務(wù)
              taskService.complete(task.getId());  
              System.out.println("name ="+task.getName()); 
              System.out.println(tasks.size());
          }
    }

運(yùn)行結(jié)果:

字?jǐn)?shù)不夠,代碼來(lái)湊,草草結(jié)束,細(xì)節(jié)之處多有遺漏,有一起學(xué)習(xí)的有問(wèn)題的可以私信。強(qiáng)行回顧了一下前兩天的學(xué)習(xí)歷程。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70264.html

相關(guān)文章

  • 深度學(xué)習(xí)調(diào)參入門(mén),有哪些技巧?

    摘要:本文將分享一些自己關(guān)于深度學(xué)習(xí)模型調(diào)試技巧的總結(jié)思考以為主。不過(guò)以卷積神經(jīng)網(wǎng)絡(luò)為代表的深層神經(jīng)網(wǎng)絡(luò)一直被詬病,這對(duì)于模型在工業(yè)界的應(yīng)用推廣還是帶來(lái)了一定的阻礙。 作者楊軍,從事大規(guī)模機(jī)器學(xué)習(xí)系統(tǒng)研發(fā)及應(yīng)用相關(guān)工作。本文將分享一些自己關(guān)于深度學(xué)習(xí)模型調(diào)試技巧的總結(jié)思考(以CNN為主)。最近因?yàn)橐恍┬枰?,參與了一些CNN建模調(diào)參的工作,出于個(gè)人習(xí)性,我并不習(xí)慣于通過(guò)單純的trial-and-er...

    Developer 評(píng)論0 收藏0
  • android知識(shí)大總結(jié) - 收藏集 - 掘金

    摘要:中簡(jiǎn)單搞定接口訪問(wèn),以及簡(jiǎn)析掘金最近總結(jié)的一些經(jīng)驗(yàn),對(duì)于或中使用接口的一些心得。這里,本文將數(shù)據(jù)結(jié)構(gòu)之學(xué)習(xí)總結(jié)掘金前言前面介紹了的數(shù)據(jù)結(jié)構(gòu),今天抽空學(xué)習(xí)總結(jié)一下另一種數(shù)據(jù)結(jié)構(gòu)。淺析事件傳遞掘金中的事件傳遞主要涉及三個(gè)方法和。 Android 系統(tǒng)中,那些能大幅提高工作效率的 API 匯總(持續(xù)更新中...) - 掘金前言 條條大路通羅馬。工作中,實(shí)現(xiàn)某個(gè)需求的方式往往不是唯一的,這些不...

    luodongseu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<