继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Activiti教程:新手入门到实践

摇曳的蔷薇
关注TA
已关注
手记 324
粉丝 54
获赞 169
概述

本文档涵盖了从Activiti的基本概念到环境搭建、API使用、BPMN建模实践以及调试监控的全面介绍。文章详细解释了Activiti的安装配置、第一个应用实例的创建、核心概念详解、API使用教程、BPMN建模实践和调试技巧。通过这些内容,读者可以深入了解并掌握Activiti的工作流程和业务流程管理能力。

Activiti简介

1. 什么是Activiti

Activiti是一个开源的工作流和业务流程管理(BPM)平台。它提供了基于BPMN 2.0标准的流程定义,支持动态的流程定义修改和扩展,适合企业和应用开发者构建灵活的业务流程管理系统。Activiti使用Java编写,可以与各种Java应用程序集成。它具有轻量级、易用、可扩展的特点,能够与Spring无缝整合,支持流程定义的动态修改。

2. Activiti的优势和应用场景

优势

  • 轻量级:Activiti是一个轻量级的框架,相较于其他商业的BPM套件,它的内存占用较小,启动速度快。
  • 易用性:Activiti提供了友好的API接口,使得流程管理和开发变得简单直接。
  • 灵活性:支持流程定义的动态修改,可以快速响应业务变化。
  • 与Spring集成:Activiti可以直接嵌入Spring应用中运行,利用Spring的依赖注入等功能。

应用场景

  • 业务流程管理:企业可以采用Activiti来实现复杂的业务流程管理。
  • 工作流自动化:通过定义工作流,实现业务流程的自动化处理。
  • 业务规则管理:Activiti能够帮助管理复杂的业务规则,通过业务流程的建模来实现。
  • 系统集成:Activiti可以集成到不同的系统中,如ERP、CRM等,帮助实现跨系统的流程管理。
Activiti版本介绍和选择

Activiti的最新稳定版本是Activiti 6.x。版本选择取决于您项目的具体需求和环境配置。Activiti 6.x版本提供了全新的API,支持BPMN 2.0标准,具备流程引擎、服务任务、用户任务、多实例任务等功能,增强了流程管理的灵活性。对于新项目,建议选择Activiti 6.x版本,如果项目已经使用旧版本并稳定运行,可以继续使用当前版本。

示例的pom.xml版本配置:

<dependencies>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>6.0.0</version>
    </dependency>
</dependencies>
Activiti环境搭建

1. 开发环境准备

为了搭建Activiti环境,首先需要准备Java开发环境。确保已经安装了JDK,并设置好环境变量。

步骤如下:

  1. 安装JDK:确保安装了JDK 8或更高版本,Activiti支持Java 11以上版本。
  2. 设置环境变量:编辑系统的环境变量设置,确保JAVA_HOME指向JDK安装目录,并将%JAVA_HOME%\bin添加到PATH环境变量中。

2. Activiti安装与配置

下载Activiti

从官方网站下载Activiti的最新版本。下载完成后,解压缩到一个目录中。

项目配置

创建一个新的Java项目,并在项目中添加Activiti依赖。这里假设使用Maven作为构建工具。

示例的pom.xml依赖配置:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>6.0.0</version>
    </dependency>
</dependencies>

示例的application.properties数据库配置:

spring.datasource.url=jdbc:mysql://localhost:3306/activiti
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driverClassName=com.mysql.jdbc.Driver

配置数据源

Activiti需要一个数据库来存储流程实例和任务的状态。这里使用MySQL作为数据库。

创建数据库和表:

CREATE DATABASE activiti;
USE activiti;

CREATE TABLE ACT_RE_DEPLOYMENT (
    ID_ VARCHAR(64) NOT NULL,
    NAME_ VARCHAR(255),
    CATEGORY_ VARCHAR(255),
    DEPLOY_TIME_ TIMESTAMP,
    TENANT_ID_ VARCHAR(255),
    PRIMARY KEY (ID_)
);

CREATE TABLE ACT_RE_PROCDEF (
    ID_ VARCHAR(64) NOT NULL,
    REV_ INT,
    CATEGORY_ VARCHAR(255),
    NAME_ VARCHAR(255),
    KEY_ VARCHAR(255) NOT NULL,
    VERSION_ INT NOT NULL,
    DEPLOYMENT_ID_ VARCHAR(64),
    RESOURCE_NAME_ VARCHAR(4000),
    DGRM_RESOURCE_NAME_ VARCHAR(4000),
    TENANT_ID_ VARCHAR(255),
    DERIVED_VIAPROPERTY_ INT,
    DERIVED_VIA-expression_ INT,
    DERIVED_EXCLUSIVE_ INT,
    SUSPENSIONSTATE_ INT,
    ENGINE_VERSION_ VARCHAR(255),
    PRIMARY KEY (ID_)
);
...

3. 第一个Activiti应用实例

接下来,我们将创建一个简单应用,通过Activiti启动一个新的流程实例。

定义流程:
首先定义一个简单的BPMN流程文件(例如:helloWorld.bpmn20.xml):

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/2010001/XMLSchema"
             id="id1" targetNamespace="http://www.activiti.org/test">
    <process id="helloWorld" name="Hello World" isExecutable="true">
        <startEvent id="startEvent1" />
        <sequenceFlow id="flow1" sourceRef="startEvent1" targetRef="endEvent1" />
        <endEvent id="endEvent1" />
    </process>
</definitions>

启动流程:
在Java代码中,加载并启动流程:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;

public class HelloWorldActiviti {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 部署流程
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("helloWorld.bpmn20.xml")
                .deploy();

        // 启动流程
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("helloWorld");
        System.out.println("Process Instance ID: " + processInstance.getId());
    }
}

该代码首先创建了一个ProcessEngine实例,然后将BPMN文件添加到流程存储中并部署,最后启动一个流程实例。通过运行此代码,您将看到输出的流程实例ID。

Activiti核心概念详解

1. Process Definition (流程定义)

流程定义是一个业务流程的模型,描述了流程的结构。流程定义通常以BPMN 2.0标准描述,它包括各种BPMN元素,如任务、网关、事件等来描述流程的不同部分。

创建流程定义文件:

<definitions xmlns="http://www.omg.org/spec/BPMN/2010001/XMLSchema"
             id="id1" targetNamespace="http://www.example.org">
    <process id="leaveRequest" name="Leave Request Process" isExecutable="true">
        <startEvent id="startEvent" />
        <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="approveTask" />
        <userTask id="approveTask" name="Approve Leave Request" />
        <sequenceFlow id="flow2" sourceRef="approveTask" targetRef="endEvent" />
        <endEvent id="endEvent" />
    </process>
</definitions>

2. Process Instance (流程实例)

流程实例是一个具体运行中的实例,它是一个流程定义的执行实例。一个流程定义可以创建多个流程实例,每个实例是一个独立的运行实例。

启动流程实例:

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest");
System.out.println("Process Instance ID: " + processInstance.getId());

3. Task (任务)

任务是构成流程的一部分,是流程中的具体活动或操作。任务可以是用户任务、服务任务等,表示流程中的具体工作内容。

查询任务:

TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("john").list();
for (Task task : tasks) {
    System.out.println("Task ID: " + task.getId());
    System.out.println("Task Name: " + task.getName());
}

4. User and Group (用户与组)

用户与组是参与流程角色的定义。用户可以被分配任务,组可以包含多个用户,用于权限管理和任务分配。

查询用户:

IdentityService identityService = processEngine.getIdentityService();
List<User> users = identityService.createUserQuery().list();
for (User user : users) {
    System.out.println("User ID: " + user.getId());
    System.out.println("User Name: " + user.getFirstName() + " " + user.getLastName());
}
Activiti API使用教程

1. 流程定义的部署

流程定义的部署是将流程定义文件部署到Activiti引擎中,以便可以在流程实例中使用。

部署流程定义:

Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("leaveRequest.bpmn20.xml")
            .deploy();
System.out.println("Deployment ID: " + deployment.getId());

2. 流程实例的启动

流程实例的启动是启动一个新的流程实例,使其开始运行。

启动流程实例:

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest");
System.out.println("Process Instance ID: " + processInstance.getId());

3. 任务的查询与完成

任务可以被查询和完成,以驱动流程的执行。

查询任务:

List<Task> tasks = taskService.createTaskQuery().taskAssignee("john").list();
for (Task task : tasks) {
    System.out.println("Task ID: " + task.getId());
    System.out.println("Task Name: " + task.getName());
}

完成任务:

taskService.complete(task.getId());

4. 实例的查询与操作

流程实例可以被查询和操作,以控制流程的执行。

查询流程实例:

List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey("12345").list();
for (ProcessInstance processInstance : processInstances) {
    System.out.println("Process Instance ID: " + processInstance.getId());
}

操作流程实例:

runtimeService.suspendProcessInstanceById(processInstance.getId());
runtimeService.activateProcessInstanceById(processInstance.getId());
Activiti BPMN建模实践

1. 使用Eclipse插件创建BPMN模型

为了创建BPMN模型,首先需要安装Eclipse插件。在Eclipse Marketplace搜索"Activiti Designer",然后安装。

步骤如下:

  1. 打开Eclipse Marketplace。
  2. 搜索"Activiti Designer"插件。
  3. 安装插件。

2. 常见BPMN元素介绍

BPMN是业务流程建模语言的标准,它定义了一系列的元素,用于描述业务流程。常见的BPMN元素包括:

  • 流程(Process):定义了流程的边界。
  • 开始事件(Start Event):流程的起点。
  • 结束事件(End Event):流程的终点。
  • 任务(Task):代表一个具体的活动。
  • 网关(Gateway):用于分支和合并流程。
  • 事件(Event):表示流程中的事件发生。
  • 泳道(Lane):表示流程中的角色或参与者。

示例流程:

<process id="leaveRequest" name="Leave Request Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="approveTask" />
    <userTask id="approveTask" name="Approve Leave Request" />
    <sequenceFlow id="flow2" sourceRef="approveTask" targetRef="endEvent" />
    <endEvent id="endEvent" />
</process>

3. 实际案例分析:请假流程建模

请假流程是一个典型的工作流应用场景。请假流程包括提交请假申请、经理审批、HR审批等环节。

请假流程模型:

<process id="leaveRequest" name="Leave Request Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="submitTask" />
    <userTask id="submitTask" name="Submit Leave Request" />
    <sequenceFlow id="flow2" sourceRef="submitTask" targetRef="approveTask" />
    <userTask id="approveTask" name="Approve Leave Request" />
    <sequenceFlow id="flow3" sourceRef="approveTask" targetRef="hrApproveTask" />
    <userTask id="hrApproveTask" name="HR Approve Leave Request" />
    <sequenceFlow id="flow4" sourceRef="hrApproveTask" targetRef="endEvent" />
    <endEvent id="endEvent" />
</process>

4. 部署和测试流程模型

在Eclipse中创建BPMN文件后,将其保存为BPMN文件(例如leaveRequest.bpmn20.xml)。

部署并启动流程实例:

Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("leaveRequest.bpmn20.xml")
            .deploy();
System.out.println("Deployment ID: " + deployment.getId());

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest");
System.out.println("Process Instance ID: " + processInstance.getId());

通过部署流程定义,启动流程实例,以及查询和完成任务,可以完成流程的测试。

Activiti调试与监控

1. 查看流程实例日志

Activiti记录了详细的日志,可以查看流程实例的日志。

查看日志:

List<HistoricProcessInstance> processInstances = historyService.createHistoricProcessInstanceQuery().list();
for (HistoricProcessInstance processInstance : processInstances) {
    System.out.println("Process Instance ID: " + processInstance.getId());
    System.out.println("Process Instance Name: " + processInstance.getName());
    System.out.println("Start Time: " + processInstance.getStartTime());
    System.out.println("End Time: " + processInstance.getEndTime());
}

2. 使用Activiti的API查询流程状态

可以通过Activiti的API查询流程实例的状态。

查询流程实例状态:

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
if (processInstance != null) {
    System.out.println("Process Instance ID: " + processInstance.getId());
    System.out.println("Process Instance Name: " + processInstance.getName());
    System.out.println("Process Instance State: " + processInstance.getState());
}

3. 使用Activiti Explorer进行流程监控

Activiti Explorer是一个Web应用,用于监控和管理流程实例。通过浏览器访问Activiti Explorer,可以查看和操作流程实例。

访问Activiti Explorer:
在Activiti引擎配置正确后,启动Activiti Explorer应用,一般通过访问http://localhost:8080/activiti-app访问。

4. Debug调试技巧

使用IDE的调试功能进行流程调试。在启动流程实例时,设置断点,跟踪流程的执行过程。

设置断点:

  1. 在代码中设置断点。
  2. 使用IDE的调试功能启动应用。
  3. 跟踪流程实例的执行过程。

通过以上步骤,可以有效地调试和监控Activiti流程实例的执行。

总结

通过以上介绍,您已经了解了Activiti的基本概念、环境搭建、API使用以及BPMN建模实践。这些内容将帮助您更好地理解和使用Activiti来构建和管理业务流程。希望本文能为您提供宝贵的指导和帮助。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP