精通activiti,从入门到绝望

了解Activiti:

     Activiti是一种工作流框架

一. 什么是工作流?

          工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在“多个参与者”之间按照某种“预定义的规则”传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。通俗的说,流程就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。

二. Activiti介绍

Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架

       1.Activiti基于Apache许可的开源BPM平台。

        2、Activiti和业界也用的多的JBPM历史渊源。

        3、它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。 并且提供了Demo,可以从里面抽取流程在线设计器。比较强大。

  三. 初始化步骤:

          

         1.导包:

   

       2.配置:

                    

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <!--数据连接信息  -->
    <property name="jdbcUrl" value="jdbc:mysql:///activiti?createDatabaseIfNotExist=true" />
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="123456" />
    <!-- 自动建表 -->
    <property name="databaseSchemaUpdate" value="true" />
  </bean>

</beans>

 

    3.测试     

// 自定义配置文件
    //
    @Test
    public void testConnect2() throws Exception {
        // 加载配置类的对象
        ProcessEngineConfiguration createProcessEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg2.xml");
        // 核心对象
        ProcessEngine buildProcessEngine = createProcessEngineConfigurationFromResource.buildProcessEngine();
        System.out.println(buildProcessEngine);
     }

    // 默认加载配置文件
    // 最佳实践
    // 约定大于配置
    @Test
    public void testConnect3() throws Exception {
        // 核心对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(processEngine);
    }

 

     

  

四.导读

使用Activiti提供的 四个核心API,按照一定的通用步骤完成工作流核心业务

   1   // 查询部署信息列表和流程定义列表
     RepositoryService getRepositoryService();
   2   // 查询运行的实例的表
     RuntimeService getRuntimeService();
   3  // 查询任务表
        TaskService getTaskService();
    4 // 查询历史的表
      HistoryService getHistoryService();

4.1流程:绘制流程-定义流程

       通过eclipese插件绘制流程,会产生两个文件:bpmn(流程定义文件),png(流程图)

            

4.2:流程定义(规则) 管理-核心(ProcessDefinition)

        1、部署流程

         2、流程定义列表查询

         3、删除流程(删除部署,流程的挂起和激活)

         4、查看规则流程图

         (没有修改,删除了重新部署!!)

代码如下:

                      

/***
 * 1.流程定义 2.流程发布
 *
 * @author Administrator
 *
 */
public class ProcessDefintionTest {
    // 添加发布部署
    @Test
    public void testDeloy() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // 获取流程发布对象
        DeploymentBuilder createDeployment = repositoryService.createDeployment();
        // 上传资源
        createDeployment.addClasspathResource("MyProcess.bpmn");
        createDeployment.addClasspathResource("MyProcess.png");
        createDeployment.name("xxx");
        // 部署发布
        Deployment deploy = createDeployment.deploy();
        System.out.println(deploy);
    }

    // 删除部署(物理删数-真删)
    @Test
    public void testdeleteDeloy() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        repositoryService.deleteDeployment("2501");
        System.out.println();
    }
    
    // 假删除部署 (挂起和激活)
    @Test
    public void testUpdateDeleteDeloy() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // 挂起
        //repositoryService.suspendProcessDefinitionByKey("myProcess");
        // 激活
        repositoryService.activateProcessDefinitionByKey("myProcess");
    }
    // 显示流程图片
    @Test
    public void testShowPng() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // web项目输出到浏览器的输入流
        // 模拟输出本地硬盘
        // 获取png图片
        String deploymentId="5001";
        String resourceName="MyProcess.png";
        // 获取输入的流对象 读的字节
        InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
        //模拟输出本地硬盘
        IOUtils.copy(resourceAsStream, new FileOutputStream("d:/a.png"));
    }
    
    
    // 查询部署列表
    @Test
    public void testQueryDeloy() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // 查询对象
        DeploymentQuery createDeploymentQuery = repositoryService.createDeploymentQuery();
        // 设置查询条件
        // createDeploymentQuery.deploymentName(name)
        //createDeploymentQuery.deploymentId(deploymentId)
        //createDeploymentQuery.deploymentNameLike(nameLike)
        //createDeploymentQuery.listPage(firstResult, maxResults)
        //createDeploymentQuery.singleResult();
        List<Deployment> list = createDeploymentQuery.list();
        for (Deployment deployment : list) {
            System.out.println(deployment.getDeploymentTime());
        }
    }
    // 查询流程定义信息列表
    @Test
    public void testQueryProcessDef() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
         // 获取查询对象
         ProcessDefinitionQuery createProcessDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        // 设置查询条件
         //createProcessDefinitionQuery.listPage(firstResult, maxResults)
         List<ProcessDefinition> list = createProcessDefinitionQuery.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd);
        }
    }
}

 

4.3:流程运行时管理-核心(ProcessInstance)

        1、启动流程

         2、查看任务

                 私有任务

                 公共任务

         3、认领任务

         4、完成任务

         5、查看流程状态

代码如下:

         

// 添加发布部署
    @Test
    public void testDeloy() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RepositoryService 仓库
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        // 获取流程发布对象
        DeploymentBuilder createDeployment = repositoryService.createDeployment();
        // 上传资源
        createDeployment.addClasspathResource("codeProcess.bpmn");
        createDeployment.addClasspathResource("codeProcess.png");
        createDeployment.name("开发任务");
        // 部署发布
        Deployment deploy = createDeployment.deploy();
        System.out.println(deploy);
    }

    // 启动流程实例
    @Test
    public void testStartInstance() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // runtimeService 运行
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
        // 根据流程的定义key启动
        ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey("myProcess");
        System.out.println(startProcessInstanceByKey);
    }

    // 获取任务列表
    @Test
    public void testQueryTask() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 获取查询对象
        TaskQuery createTaskQuery = taskService.createTaskQuery();
        List<Task> list = createTaskQuery.list();
        for (Task task : list) {
            System.out.println(task);
        }
    }

    // 获取某个人的任务列表
    @Test
    public void testQueryTaskByName() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 获取查询对象
        TaskQuery createTaskQuery = taskService.createTaskQuery();
        // 设置查询条件
        createTaskQuery.taskAssignee("ls");
        List<Task> list = createTaskQuery.list();
        for (Task task : list) {
            System.out.println(task);
        }
    }

    // zs 办理完成任务 私有任务
    @Test
    public void testCompleTaskByName() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 完成任务
        String taskId = "10004";
        taskService.complete(taskId);

    }
    // ww 办理完成任务 私有任务
    @Test
    public void testwwCompleTaskByName2() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 完成任务
        String taskId = "5002";
        taskService.complete(taskId);
        
    }

    // zs 认领公有任务
    @Test
    public void testCaimTask() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 完成任务
        String taskId = "2504";
        String userId="zs";
        // 要
        taskService.claim(taskId, userId);
    }

    // ls 办理完成任务 私有任务
    @Test
    public void testlsCompleTaskByName() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // TaskService 任务
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 完成任务
        String taskId = "12502";
        taskService.complete(taskId);

    }

    // 查询流程是否结束
    @Test
    public void testIsEnd() throws Exception {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // RuntimeService 运行
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
        // 查询对象
        ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery();
        // 根据id
        ProcessInstance singleResult = createProcessInstanceQuery.processInstanceId("2501").singleResult();
        // 如果singleResult找到说明流程还没有结束
        if (singleResult != null) {
            System.out.println("流程未结束或不存在");
        } else {
            System.out.println("流程结束");
        }

    }
}

 4.4.查看历史流程活动

   代码如下:

              

/**
 * 历史查询
 *
 * @author Administrator
 *
 */
public class History_Test {

    // 有多少次执行这个实例流程(也就是有多少人离职)
    @Test
    public void queryHisprocessdef() {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取历史服务
        HistoryService historyService = defaultProcessEngine.getHistoryService();
        // 获取查询对象
        HistoricProcessInstanceQuery createHistoricProcessInstanceQuery = historyService
                .createHistoricProcessInstanceQuery();
        // 设置查询条件
        createHistoricProcessInstanceQuery.processDefinitionKey("myProcess");
        // 获取列表
        List<HistoricProcessInstance> list = createHistoricProcessInstanceQuery.list();
        System.out.println("离职人数:" + list.size());
    }

    // 获取活动节点日志--(查询那些人办理任务)
    @Test
    public void queryAci() {
        // 获取核心对象 服务大管家
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取历史服务
        HistoryService historyService = defaultProcessEngine.getHistoryService();
        // 获取查询对象
         HistoricActivityInstanceQuery createHistoricActivityInstanceQuery = historyService
                .createHistoricActivityInstanceQuery();
        // 设置查询条件
         createHistoricActivityInstanceQuery.processInstanceId("2501");
        // 获取列表
         List<HistoricActivityInstance> list = createHistoricActivityInstanceQuery.list();
        for (HistoricActivityInstance ac : list) {
            System.out.println("=================");
            System.out.println(ac.getActivityId());
            System.out.println(ac.getActivityName());
            System.out.println(ac.getStartTime());
            System.out.println(ac.getEndTime());
        }
    }

}

另外:文中使用了反编译插件去查询底层源码,只需要把文件挪到eclipse储放的位置dropins中即可。

以上便是Activiti的四大核心Api,有没有一丝绝望的感觉?

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值