Activiti服务架构和流程定义

本文深入探讨Activiti工作流引擎的架构,包括关键配置文件activiti.cfg.xml的作用,ProcessEngine的创建过程,以及如何通过它创建各种Service接口进行流程部署、执行和管理。同时,介绍了RepositoryService、RuntimeService、TaskService和HistoryService的功能,以及如何进行流程定义的部署、查询、删除和资源获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本架构介绍

在这里插入图片描述
1.activiti.cfg.xml:
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,
此文件其实就是一个 spring 配置文件

2.ProcessEngine
工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration 创建 processEngine,通过
ProcessEngine 创建各个 service 接口

//1.创建ProcessEngineConfiguration对象  第一个参数:配置文件名称  第二个参数是processEngineConfiguration的bean的id
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration
                .createProcessEngineConfigurationFromResource("activiti.cfg.xml");
        //2.创建ProcesEngine对象 
        ProcessEngine processEngine = configuration.buildProcessEngine();

3.Service 创建方式

通过 ProcessEngine 创建 Service,Service 是工作流引擎提供用于进行工作流部署、执行、管理的服
务接口。
方式如下:
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();

在这里插入图片描述

RepositoryService
是 activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工
具设计的业务流程图需要使用此 service 将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:
查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活
是对应的反向操作。
获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的 pojo 版本, 可以用来通过 java 解析流程,而不必通过 xml。
RuntimeService
它是 activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
是 activiti的任务管理类。可以从这个类中获取任务的信息。
HistoryService
是 activiti 的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比
如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个
服务主要通过查询功能来获得这些数据。

2.部署流程定义

	@Test
public void testGenTable(){
    //1.创建ProcessEngineConfiguration对象  第一个参数:配置文件名称  第二个参数是processEngineConfiguration的bean的id
    ProcessEngineConfiguration configuration = ProcessEngineConfiguration
            .createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    //2.创建ProcesEngine对象 
    ProcessEngine processEngine = configuration.buildProcessEngine();

    // 得到流程定义部署
    RepositoryService repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addClasspathResource("bpmn/holiday.bpmn")
        .addClasspathResource("bpmn/holiday.png")
        .name("请假申请流程")
        .deploy();

  
}

影响的表:
1.act_re_deployment
在这里插入图片描述
报存流程定义的基本信息

2.act_re_procdef
在这里插入图片描述
在这里插入图片描述
key可以识别不同的流程定义,version表示不通版本

3.act_ge_bytearray

在这里插入图片描述
报存流程定义的xml文件

3.查询流程定义

 @Test
public void queryProceccDefinition() {
    // 得到流程定义引擎
    ProcessEngineConfiguration configuration = ProcessEngineConfiguration
            .createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    // 创建ProcesEngine对象
    ProcessEngine processEngine = configuration.buildProcessEngine();
// 流程定义key
    String processDefinitionKey = "holiday";
// 获取repositoryService
    RepositoryService repositoryService = processEngine
            .getRepositoryService();
// 查询流程定义
    ProcessDefinitionQuery processDefinitionQuery = repositoryService
            .createProcessDefinitionQuery();
//遍历查询结果
    List<ProcessDefinition> list = processDefinitionQuery
            .processDefinitionKey(processDefinitionKey)
            .orderByProcessDefinitionVersion().desc().list();
    for (ProcessDefinition processDefinition : list) {
        System.out.println("------------------------");
        System.out.println(" 流 程 部 署 id : "  +
                processDefinition.getDeploymentId());
        System.out.println("流程定义id:" + processDefinition.getId());
        System.out.println("流程定义名称:" + processDefinition.getName());
        System.out.println("流程定义key:" + processDefinition.getKey());
        System.out.println("流程定义版本:" + processDefinition.getVersion());
    }
}

4.流程定义的删除

	public void deleteDeployment() {
// 流程部署id
String deploymentId = "8801";
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设
置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
}

5.流程定义资源查询

		通过流程定义对象获取流程定义资源,获取bpmn 和 png。
@Test
public void getProcessResources() throws IOException {
// 流程定义id
String processDefinitionId = "";
// 获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
// 流程定义对象
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
//获取bpmn
String resource_bpmn = processDefinition.getResourceName();
//获取png
String  resource_png  =
processDefinition.getDiagramResourceName();
// 资源信息
System.out.println("bpmn:" + resource_bpmn);
System.out.println("png:" + resource_png);
File file_png = new File("d:/purchasingflow01.png");
File file_bpmn = new File("d:/purchasingflow01.bpmn");
// 输出bpmn
InputStream resourceAsStream = null;
resourceAsStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), resource_bpmn);
FileOutputStream  fileOutputStream  =  new
FileOutputStream(file_bpmn);
传智播客——专注于 Java、.Net 和Php、网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
byte[] b = new byte[1024];
int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
fileOutputStream.write(b, 0, len);
}
// 输出图片
resourceAsStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), resource_png);
fileOutputStream = new FileOutputStream(file_png);
// byte[] b = new byte[1024];
// int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
fileOutputStream.write(b, 0, len);
}
}

6.流程历史信息的查看

/**	即使流程定义已经删除了依然保存在 activiti 的 act_hi_*相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过 HistoryService 来查看相关的历史
记录。
**/
public void testHistoric01(){
HistoryService historyService = pe.getHistoryService();
HistoricActivityInstanceQuery query =
historyService.createHistoricActivityInstanceQuery();
query.processInstanceId("1501");
List<HistoricActivityInstance> list = query.list();
for(HistoricActivityInstance ai :list){
System.out.println(ai.getActivityId());
System.out.println(ai.getActivityName());

System.out.println(ai.getProcessDefinitionId());
System.out.println(ai.getProcessInstanceId());
System.out.println("==============================");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值