栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Activiti工作流引擎

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Activiti工作流引擎

Activiti工作流引擎
      • 一、Activiti简介
        • 1.1、Activiti工作流引擎
        • 1.2、Activiti核心类
      • 二、Activiti7与SpringBoot整合开发
        • 2.1、引入maven依赖
        • 2.2、创建配置文件application.yml
        • 2.3、编写启动类
        • 2.4、创建BPMN文件
        • 2.5、使用junit方式测试

一、Activiti简介 1.1、Activiti工作流引擎

Activiti正是目前使用最为广泛的开源工作流引擎。activiti官网地址Activiti历经6.x和5.x两个大的版本,目前最新的版本是 Activiti Cloud 7.1.0-M11。
他可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义。业务流程按照预先定义的流程执行,整个实现流程完全由activiti进行管理,从而减少业务系统由于流程变更进行系统改造的工作量,从而减少系统开发维护成本,提高系统的健壮性。所以使用Activiti,重点就是两个步骤,首先使用BPMN定义流程,然后使用Activiti框架实现流程。

1.2、Activiti核心类
service名称service作用
RepositoryServiceactiviti的资源管理类
RuntimeServiceactiviti的流程运行管理类
TaskServiceactiviti的任务管理类
HistoryServiceactiviti的历史管理类
ManagerServiceactiviti的引擎管理类

简单介绍:

RepositoryService
是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。

RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息

TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。

HistoryService
Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。

ManagementService
Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。

二、Activiti7与SpringBoot整合开发

Activiti7正式版发布后,就已经支持与SpringBoot2.X版本完全整合开发了。

2.1、引入maven依赖
 
    org.activiti
    activiti-spring-boot-starter 
    7.0.0.Beta2 

2.2、创建配置文件application.yml
spring: 
    datasource: 
        url: jdbc:mysql://localhost:3306/activiti? useUnicode=true&characterEncoding=utf8&serverTimezone=GMT 
        username: root 
        password: root 
        driver-class-name: com.mysql.cj.jdbc.Driver 
    activiti: 
        database-schema-update: true 
        #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录 
        db-history-used: true 
        #记录历史等级 可配置的历史级别有none, activity, audit, full 
        #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
        #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
        #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为 history的默认值。 
        #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关 的细节数据,包括一些流程参数等。 
        history-level: full 
        #校验流程文件,默认校验resources下的processes文件夹里的流程文件 
        check-process-definitions: false
2.3、编写启动类
@SpringBootApplication 
public class ActApplication { 
    public static void main(String[] args) { 
         SpringApplication.run(ActApplication.class,args); 
    } 
}
2.4、创建BPMN文件

Activiti7可以自动部署流程,前提是在resources目录下,创建一个新的目录processes,用来放置bpmn文件。创建一个简单的Bpmn流程文件,并设置任务的用户组Candidate Groups。

2.5、使用junit方式测试

使用SpringBoot集成Activiti后,每次启动项目时,会自动部署之前放的bpmn文件,并且,会在Spring容器中自动注入Activiti的几个核心Service。

@RunWith(SpringRunner.class) 
@SpringBootTest
public class SpingBootActivitiDemo {

    @Autowired 
    private RuntimeService runtimeService; 

    @Autowired
    private TaskService taskService; 

    @Autowired 
    private RepositoryService repositoryService; 

    @Autowired 
    private HistoryService historyService;

    //启动流程实例
    @Test 
    public void testStartProcess(){
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myLeave");
        // 输出内容 
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); 
        System.out.println("流程实例id:" + processInstance.getId()); 
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

    //查询当前个人待执行的任务
    @Test 
    public void testFindPersonalTaskList() {
        // 任务负责人 
        String assignee = "worker"; 
        // 根据流程key 和 任务负责人 查询任务
        List list = taskService.createTaskQuery()
                .processDefinitionKey("myLeave")//流程Key 
                .taskAssignee(assignee)//只查询该任务负责人的任务 
                .list();

        for (Task task : list) { 
            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId()); 
            System.out.println("任务负责人:" + task.getAssignee()); 
            System.out.println("任务名称:" + task.getName()); 
        }
    }

    // 完成任务 
    @Test 
    public void completTask(){ 
        // 根据流程key 和 任务的负责人 查询任务 
        // 返回一个任务对象 
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myLeave") //流程Key 
                .taskAssignee("worker") //要查询的负责人 
                .singleResult(); 
        // 完成任务,参数:任务id 
        taskService.complete(task.getId()); 
    }

    //查询流程定义
    @Test 
    public void queryProcessDefinition(){
        // 得到ProcessDefinitionQuery 对象 
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); 
        // 查询出当前所有的流程定义 
        // 条件:processDefinitionKey =evection 
        // orderByProcessDefinitionVersion 按照版本排序 
        // desc倒叙 
        // list 返回集合 
        List definitionList = processDefinitionQuery.processDefinitionKey("myLeave") 
                .orderByProcessDefinitionVersion() 
                .desc()
                .list();
        // 输出流程定义信息 
        for (ProcessDefinition processDefinition : definitionList) { 
            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("流程部署ID ="+processDefinition.getDeploymentId());
        }
    }

    //查询流程实例
    @Test 
    public void queryProcessInstance() {
        // 流程定义key 
        String processDefinitionKey = "myLeave"; 
        List list = runtimeService.createProcessInstanceQuery()
                .processDefinitionKey(processDefinitionKey)
                .list();
        
        for (ProcessInstance processInstance : list) { 
            System.out.println("----------------------------"); 
            System.out.println("流程实例id:" + processInstance.getProcessInstanceId()); 
            System.out.println("所属流程定义id:" + processInstance.getProcessDefinitionId()); 
            System.out.println("是否执行完成:" + processInstance.isEnded()); 
            System.out.println("是否暂停:" + processInstance.isSuspended()); 
            System.out.println("当前活动标识:" + processInstance.getActivityId()); 
            System.out.println("业务关键字:" + processInstance.getBusinessKey()); }
    }

    @Test 
    public void deleteDeployment() {
        // 流程部署id 
        String deploymentId = "1"; 
        //删除流程定义,如果该流程定义已有流程实例启动则删除时出错 
        repositoryService.deleteDeployment(deploymentId);

        //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false 非级别删除方式,如果流程 
        // repositoryService.deleteDeployment(deploymentId, true);
    }

    @Test 
    public void queryBpmnFile() throws IOException {
        // 3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义 
        ProcessDefinition processDefinition = repositoryService
                .createProcessDefinitionQuery() 
                .processDefinitionKey("myLeave")
                .singleResult();
        // 4、通过流程定义信息,得到部署ID 
        String deploymentId = processDefinition.getDeploymentId(); 
        // 5、通过repositoryService的方法,实现读取图片信息和bpmn信息 
        // png图片的流
        InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
        // bpmn文件的流 
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
        // 6、构造OutputStream流 
        File file_png = new File("d:/myLeave.png"); 
        File file_bpmn = new File("d:/myLeave.bpmn"); 
        FileOutputStream bpmnOut = new FileOutputStream(file_bpmn); 
        FileOutputStream pngOut = new FileOutputStream(file_png);
        // 7、输入流,输出流的转换 
        IOUtils.copy(pngInput,pngOut); 
        IOUtils.copy(bpmnInput,bpmnOut); 
        // 8、关闭流 
        pngOut.close(); 
        bpmnOut.close(); 
        pngInput.close(); 
        bpmnInput.close();
    }

    //查看历史信息
    @Test public void findHistoryInfo(){
        // 获取 actinst表的查询对象 
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery(); 
        // 查询 actinst表,条件:根据 InstanceId 查询,查询一个流程的所有历史信息 
        instanceQuery.processInstanceId("25001"); 
        // 查询 actinst表,条件:根据 DefinitionId 查询,查询一种流程的所有历史信息 // 
        instanceQuery.processDefinitionId("myLeave:1:22504"); 
        // 增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排 序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc(); 
        // 查询所有内容 
        List activityInstanceList = instanceQuery.list(); 
        // 输出 
        for (HistoricActivityInstance hi : activityInstanceList) { 
            System.out.println(hi.getActivityId()); 
            System.out.println(hi.getActivityName()); 
            System.out.println(hi.getProcessDefinitionId()); 
            System.out.println(hi.getProcessInstanceId()); 
            System.out.println("<==========================>"); 
        }
    }

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号