【Activiti】原理

一、核心类

  • RepositoryService:部署管理流程资源,如bpmn文件、附件等等;
  • RuntimeService:操作运行时的流程;
  • TaskService:流程中任务的信息;
  • HistoryService:流程的历史信息;
  • ManagerService:管理流程引擎的信息。

二、核心表

  • ACT_GE_*:General,表示通用表。
  • ACT_HI_*:History,保存历史数据,比如执行过的流程实例、变量、任务等等。Activiti默认提供四种历史级别:none(不保存任何历史记录)、activity(保存所有的流程实例、任务、活动信息)、audit(默认级别,保存所有的流程实例、任务、活动、表单属性)、full(最完整的历史记录,详细到日志跟踪)。
  • ACT_ID_*:Identity,保存身份信息,比如用户和组之间的关系。Activiti被集成到某一系统时,这些表可以不用,而直接使用现有系统中的用户或组信息。
  • ACT_RE_*:Repository,保存一些仓库信息,比如流程定义流程资源(图片或规则等)。
  • ACT_RU_*:Runtime,保存一些流程实例用户任务变量等的运行时数据。当流程结束后会立即移除这些数据。

三、使用步骤

(1)编写bpmn文件,画流程图,在application.yml配置文件中【process-definition-location-prefix】标明需要扫描的流程图路径;

(2)创建流程引擎;

(3)获取RepositoryService实例:相当于拿到数据库连接;

(4)使用RepositoryService部署流程:相当于使用RepositoryService操作数据库。此处可设置流程名字、addClassPathResource()绑定流程图、部署流程。

(5)启动流程【RuntimeService】;

(6)创建任务【TaskService】;

(7)根据流程定义处理人等查询,并根据任务ID完成任务:taskService.complete()。

// 1.创建流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

// 2.获取RepositoryService实例:相当于拿到数据库连接
RepositoryService repositoryService = processEngine.getRepositoryService();

// 3.使用RepositoryService部署流程:相当于使用RepositoryService操作数据库
Deployment deployment = repositoryService.createDeployment()
        .name("请假申请流程")                        // 设置流程的名称
        .addClasspathResource("processes/Leave.bpmn")    // 设置流程所用到的资源
        .addClasspathResource("processes/Leave.png")     // 设置流程所用到的图片
        .deploy();    // 部署流程,相当于插入操作

// 4.获取RuntimeService,根据流程定义ID启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myLeave");

// 5.创建TaskService,根据流程key和任务负责人查询此流程(myLeave)下的该负责人(zhangsan)所拥有的任务信息。
TaskService taskService = processEngine.getTaskService();

// 6.获取TaskService,完成任务
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
        .processDefinitionKey("myLeave")
        .taskAssignee("zhangsan")
        .singleResult();
if (task != null) {
    taskService.complete(task.getId());
}

四、 Activiti和Flowable对比

(一)Flowable的优点:

  • 架构灵活:Flowable的架构非常灵活,可以轻松地嵌入到Spring或者其他Java应用中,也可以作为独立的服务运行。
  • 扩展性强:Flowable提供了插件机制,可以方便地扩展和定制工作流引擎的功能。
  • 高可用性:Flowable支持分布式部署,可以实现高可用性的工作流引擎。
  • 维护活跃:Flowable项目有一个活跃的社区,提供了及时的技术支持和更新。

(二)Flowable的缺点:

  • 文档相对较少:Flowable相对于Activiti,文档相对较少。
  • 社区相对较小:Flowable的社区相对于Activiti,规模较小。

(三)Activiti的优点:

  • 文档详细:Activiti的官方文档非常详细,易于新手学习和使用。
  • 社区活跃:Activiti的社区规模较大,提供了广泛的技术支持和资源。
  • 易于集成:Activiti可以轻松地与Spring集成,也可以作为独立的服务运行。
  • 贡献者较多:Activiti是一个比较成熟的工作流引擎,有大量的贡献者和用户,可以提供成熟的解决方案。

(四)Activiti的缺点:

  • 扩展性较弱:Activiti的插件机制较为有限,扩展和定制功能不如Flowable方便。
  • 可靠性较低:Activiti在一些用户反馈的场景下,存在一些稳定性问题,需要注意。