Activiti 工作流使用快速入门

目录

工作流概述

一、Activiti概述

二、快速入门

1.准备工作

2.导入相关依赖

3.创建配置文件

4.创建activiti所需的25张表

 5.idea操作

 6.流程部署

7.启动流程实例

8.查询个人待办任务

9.完成个人任务

10.查看历史信息


工作流概述

工作流就是“业务过程的部分或整体在计算机应用环境下的自动化”,他主要解决的是“使多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行”,从而实现某个预期的业务目标、或者促使此目标的实现。


一、Activiti概述

Activiti 是一个针对业务人员、开发人员和系统管理员的轻量级工作流和业务流程管理 (BPM) 平台。 它的核心是一个用于 Java 的超快速和坚如磐石的 BPMN 2 流程引擎。 它是开源的,并在 Apache 许可下分发。 Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。 它与 Spring 完美集成,非常轻量级,基于简单的概念。

二、快速入门

1.准备工作

①IDEA需要安装actibpm插件,新版idea可直接在plugins中搜索Activiti BPMN visualizer安装即可

 ②安装Camunda Modeler插件(用来操作bpmn文件画板),解压即可使用。

链接:https://pan.baidu.com/s/1BIj1yTHGHfxu1q_H1l4LcQ 
提取码:0505

idea配置插件:File > setting > Tools > External tool > 点击+

 验证:完成以上操作后在此处看见有新增的工具即可

 

2.导入相关依赖

使用Maven创建一个普通web项目,并导入ActivitiMySQL相关依赖(activiti需要数据库支持才能工作)。

pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sailing</groupId>
    <artifactId>activit_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--定义版本号-->
    <properties>
        <java.version>1.8</java.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <activiti.version>7.0.0.Beta1</activiti.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--activiti核心包-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--activiti与spring整合的包-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--bpmn模型处理-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--bpmn转换-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--bpmn json数据转换-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--bpmn布局-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--bpmn云支持-->
        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
    </dependencies>
</project>

3.创建配置文件

resources目录下,创建一个名为log4j.properties的日志配置文件,用于监测activiti工作流的日志信息。

log4j.rootCategory=debug,CONSOLE,LOGFILE

log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#???????
log4j.appender.LOGFILE.File=c:\\SOFT\\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n

使用activiti提供的默认方式来创建mysql的表。默认方式的要求是在resources下创建activiti.cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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://localhost:3306/myactiviti?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=true&amp;serverTimezone=UTC&amp;nullCatalogMeansCurrent=true"></property>
    <property name="jdbcUsername" value="root"></property>
    <property name="jdbcPassword" value="root"></property>
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>

    <property name="databaseSchemaUpdate" value="true"/>
  </bean>
</beans>

4.创建activiti所需的25张表

test目录下新建一个类,生成activiti所需的25张表:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;

public class ActivitiUtil {

    /**
     *使用activiti提供的默认方式来创建mysql的表
     */
    @Test
    public void generateTable()
    {
        ProcessEngine processEngine = ProcessEngineConfiguration
                .createProcessEngineConfigurationFromResource("activiti.cfg.xml")
                .buildProcessEngine();
        System.out.println(processEngine);
    }

}

生成表如下:

 这些数据表都是以act为前缀的,表明是activiti所需的数据表。其中act_ge_*用于存放通用类型的数据;act_hi_*存放历史数据;act_re_*存放流程定义的内容和所需静态资源;act_ru_*存放activiti运行时所需的数据。

 5.idea操作

①创建bpmn文件

在resources目录下创建bpmn目录,然后在bpmn目录下新建一个bpmn文件,命名随意,但最好有意义。

② 操作文件

(1)、利用Camunda Modeler插件打开画板

 进入画板界面如下:画板左侧竖框里为可添加的节点,可通过拖拉拽等操作进行流程配置 

 上图为一个简单的流程配置,配置完毕后保存即可在idea中的xml文件自动生成相关代码,流程配置完成后也可生成流程图片

 6.流程部署

@Test
    //流程部署  修改ACT_RE_DEPLOYMENT(流程部署表) ACT_GE_PROPERTY(流程定义表)
    public void test() {
        //1、创建(流程引擎)ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取RepositoryServcie(re表的服务层)\
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3、使用service进行流程的部署,部署bpmn和png
        Deployment deploy = repositoryService.createDeployment()
                .name("出差申请流程")
                .addClasspathResource("bpmn/cc.bpmn20.xml")
//                .addClasspathResource("bpmn/cc.bpmn20.png")
                .deploy();
    }

7.启动流程实例

    //启动实例  修改表ACT_HI_TASKINST(历史任务实例数据表)ACT_HI_PROCINST(历史流程实例数据表,正在执行的任务也在其中)ACT_HI_ACTINST(历史节点数据,图片上的节点信息)
    //ACT_HI_IDENTITYLINK(历史流程用户信息数据表)ACT_RU_EXECUTION(运行时流程执行实例数据表,一条是开始事件的执行实例,这个一直存在,只到流程结束后才会自动删除,is_active字段表示是否正在执行实例)
    //ACT_RU_TASK(运行时任务信息数据信息表)
    @Test
    public void qdTest() {
        //1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//3、根据流程定义的id启动流程
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("cc");//key 为bpmn文件名

    }

8.查询个人待办任务

//查询个人待办任务
    @Test
    public void findRw() {
        //1、获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取taskService
        TaskService taskService = processEngine.getTaskService();
        //3、根据流程key 和 任务的负责人 查询任务
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("cc") //流程Key
                .taskAssignee("worker")  //要查询的负责人(assignee)
                .list();
        //4、输出
        for (Task task : taskList) {
            System.out.println("流程实例id=" + task.getProcessInstanceId());
            System.out.println("任务Id=" + task.getId());
            System.out.println("任务负责人=" + task.getAssignee());
            System.out.println("任务名称=" + task.getName());
        }

    }

9.完成个人任务

方式一(完成当前节点的任务):

 //完成个人任务(完成指定人的任务)
    @Test
    public void okRw() {
        //获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
        TaskService taskService = processEngine.getTaskService();
//完成任务,参数:任务id,完成zhangsan的任务,10005是上述ACT_RU_TASK表的id
        taskService.complete("125003");

    }

方式二(完成其余节点任务)

 //完成剩余节点的任务
    @Test
    public void okSyRw() {
        //完成jerry的任务
//获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
        TaskService taskService = processEngine.getTaskService();
//获取jerry - myEvection 对应的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("cc")
                .taskAssignee("lala")
                .singleResult();
        System.out.println("流程实例id=" + task.getProcessInstanceId());
        System.out.println("任务Id=" + task.getId());
        System.out.println("任务负责人=" + task.getAssignee());
        System.out.println("任务名称=" + task.getName());
//完成jerry的任务
        taskService.complete(task.getId());
//输出
//流程实例id=10001
//任务Id=12502
//任务负责人=jerry
//任务名称=经理审批

//完成jack的任务
        Task taskjack = taskService.createTaskQuery()
                .processDefinitionKey("cc")
                .taskAssignee("rose")
                .singleResult();
        System.out.println("流程实例id=" + taskjack.getProcessInstanceId());
        System.out.println("任务Id=" + taskjack.getId());
        System.out.println("任务负责人=" + taskjack.getAssignee());
        System.out.println("任务名称=" + taskjack.getName());
//完成jack的任务
        taskService.complete(task.getId());

//输出
//流程实例id=10001
//任务Id=15002
//任务负责人=jack
//任务名称=总经理审批

//完成rose的任务
//        taskjack = taskService.createTaskQuery()
//                .processDefinitionKey("test`")
//                .taskAssignee("rose")
//                .singleResult();
//        System.out.println("流程实例id=" + taskjack.getProcessInstanceId());
//        System.out.println("任务Id=" + taskjack.getId());
//        System.out.println("任务负责人=" + taskjack.getAssignee());
//        System.out.println("任务名称=" + taskjack.getName());
完成jack的任务
//        taskService.complete(task.getId());

//输出
//流程实例id=10001
//任务Id=17502
//任务负责人=rose
//任务名称=财务审批

    }

10.查看历史信息

 //查看历史信息
    @Test
    public void findMsg() {
        //获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//获取 actinst表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//查询 actinst表,条件:根据 InstanceId 查询
//instanceQuery.processInstanceId("2501");
//查询 actinst表,条件:根据 DefinitionId 查询
        instanceQuery.processDefinitionId("cc:1:15003");
//增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//查询所有内容
        List<HistoricActivityInstance> 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("<==========================>");
        }

    }

输出:

sid-28bf87b6-fcc1-4765-a9e5-525c6c9fa9c8
开始流程
cc:1:15003
17501
<==========================>
sid-ee93fbee-de9e-49c9-8017-8509e6998a28
提交出差申请
cc:1:15003
17501
<==========================>
sid-25a1d1fd-16f7-469d-a3be-8f03bee416b6
主管审批
cc:1:15003
17501
<==========================>
sid-7880c303-7f43-43a8-a9c0-55258addead2
经理审批
cc:1:15003
17501
<==========================>
sid-e215c013-23a9-415a-bbd2-1904ea2b5d55
结束流程
cc:1:15003
17501
<==========================>
sid-28bf87b6-fcc1-4765-a9e5-525c6c9fa9c8
开始流程
cc:1:15003
27501
<==========================>
sid-ee93fbee-de9e-49c9-8017-8509e6998a28
提交出差申请
cc:1:15003
27501
<==========================>
sid-25a1d1fd-16f7-469d-a3be-8f03bee416b6
主管审批
cc:1:15003
27501
<==========================>
sid-7880c303-7f43-43a8-a9c0-55258addead2
经理审批
cc:1:15003
27501
<==========================>
sid-e215c013-23a9-415a-bbd2-1904ea2b5d55
结束流程
cc:1:15003
27501
<==========================>

以上为activiti基本的使用流程,其他功能需使用监听器、变量、网关等进行实现,相关教程后续发出。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值