org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id 's

本文解决了一个在使用Activiti进行流程引擎搭建时遇到的问题,即启动流程时出现流程定义ID不存在的错误。通过仔细分析错误信息并对比代码实现,发现原因在于误用了startProcessInstanceById方法,而应该使用startProcessInstanceByKey方法。文章详细阐述了问题的原因、解决过程,并提供了部分流程XML代码和测试代码作为参考。

来源:http://www.hxstrive.com/article/125.htm

 

今天开始学习Activiti,在搭建环境的时候出现了很多错误。其他问题都解决了,唯独下面这个问题纠结了很久。还好最后还是解决了。

错误信息:
70 [main] INFO org.activiti.engine.ProcessEngines - Initializing process engine using configuration 'file:/F:/Project_All/Eclipase_Workspace/Activiti_test01/bin/activiti.cfg.xml'
89 [main] INFO org.activiti.engine.ProcessEngines - initializing process engine for resource file:/F:/Project_All/Eclipase_Workspace/Activiti_test01/bin/activiti.cfg.xml
2015-2-14 9:07:16 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from resource loaded through InputStream
17767 [main] INFO org.activiti.engine.impl.ProcessEngineImpl - ProcessEngine default created
17767 [main] INFO org.activiti.engine.impl.jobexecutor.JobExecutor - Starting up the JobExecutor[org.activiti.engine.impl.jobexecutor.DefaultJobExecutor].
17818 [main] INFO org.activiti.engine.ProcessEngines - initialised process engine default
17819 [Thread-1] INFO org.activiti.engine.impl.jobexecutor.AcquireJobsRunnable - JobExecutor[org.activiti.engine.impl.jobexecutor.DefaultJobExecutor] starting to acquire jobs
18204 [main] INFO org.activiti.engine.impl.bpmn.deployer.BpmnDeployer - Processing resource bpmn/activiti_test01.bpmn20.xml
21012 [main] ERROR org.activiti.engine.impl.interceptor.CommandContext - Error while closing command context
org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id 'simpleApprovalProcess'
at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedProcessDefinitionById(DeploymentManager.java:55)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:59)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:36)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceById(RuntimeServiceImpl.java:72)
at com.bug315.ActivitiTest01.main(ActivitiTest01.java:22)
Exception in thread "main" org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id 'simpleApprovalProcess'
at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedProcessDefinitionById(DeploymentManager.java:55)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:59)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:36)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceById(RuntimeServiceImpl.java:72)
at com.bug315.ActivitiTest01.main(ActivitiTest01.java:22)

我的Java代码:
package com.bug315;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class ActivitiTest01 {

public static void main(String[] args) {
// 创建流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

// 获取流程存储服务组件
RepositoryService repositoryService = processEngine.getRepositoryService();

// 获取运行时服务组件
RuntimeService runtimeService = processEngine.getRuntimeService();

// 获取流程任务组件
TaskService taskService = processEngine.getTaskService();

// 1、部署流程文件
repositoryService.createDeployment().name("myProcess")
.addClasspathResource("bpmn/activiti_test01.bpmn").deploy();

// 2、启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
//runtimeService.startProcessInstanceById("myProcess");
System.out.println(processInstance.getId());

// 3、查询第一个任务
Task task = taskService.createTaskQuery().singleResult();
System.out.println("============" + task.getId() + "============");
taskService.complete(task.getId()); // 完成任务

// 4、查询第二个任务
task = taskService.createTaskQuery().singleResult();
System.out.println("============" + task.getId() + "============");
taskService.complete(task.getId()); // 完成任务

// 5、流程结束
task = taskService.createTaskQuery().singleResult();
System.out.println("============ 任务结束(" + task + ") ============");
}

}

解决办法:
仔细看上面的异常是指定的流程定义ID不存在。再仔细看看我的代码,我的愿意是通过流程定义中<process>元素的id去启动流程。但是我错误写使用了startProcessInstanceById方法。因此将startProcessInstanceById()方法改为startProcessInstanceByKey()方法就解决问题了。你到act_re_procdef表中去查看ID_字段的格式为:myProcess:1:4,所以根本就不存在ID等于myProcess的流程定义。这些都是初心大意造成的,不知你是否也犯过这种低级错误。

部分流程XML代码:
1
<process id="myProcess" name="My process" isExecutable="true">

部分测试代码:
// 2、启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
// runtimeService.startProcessInstanceById("myProcess"); // 这里调用方法写错了

 

 

 

 

<think> 首先,用户的问题是关于解决“org.activiti.engine.ActivitiObjectNotFoundException: no processes deployed with key 'Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c'”错误的方法。用户提供了两个引用: - 引用[1]:描述了启动项目时出现类似错误,但没有指定具体解决方法。 - 引用[2]:解释了错误的原因,即KEY值不正确,可能是混淆了name和KEY,KEY实际上是流程图的ID属性,可以从Properties查看或从ACT_RE_PROCDEF表中查询。 用户的上一次问题或我的回答没有提供,因为这是用户的新查询。我需要基于系统级指令来回答: - 所有行内数学表达式使用$...$,但这里没有数学内容,所以可能不需要。 - 独立公式使用$$...$$并单独成段,同样不适用。 - LaTeX语法正确:确保任何公式正确。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:用户提供了引用[1]和[2],我需要自然地引用它们。 关键点:用户需要解决“no processes deployed with key”错误。基于引用[2],错误的原因是KEY值不正确。KEY应该是流程图的ID,而不是name。 解决方法步骤: 1. 确认KEY是否正确:KEY必须是流程图的ID值,不是name。 2. 如何找到正确的KEY: - 在流程图的Activiti Modeler中,右键流程图,查看Properties,找到ID属性。 - 或者查询数据库表ACT_RE_PROCDEF,使用DEPLOYMENT_ID_来查找KEY。 3. 确保流程已部署:错误表明没有部署的流程,所以检查流程是否成功部署。 4. 部署流程的代码:在Activiti中,部署流程需要调用runtimeService或repositoryService来部署BPMN文件。 结构化回答: - 解释错误原因。 - 提供解决步骤。 - 自然地引用提供的引用。 - 最后生成相关问题。 引用标识:[^1]和[^2],用户在输入中提供了这些,所以我需要在回答中引用它们时使用。 完整回答结构: 1. 引言:理解问题和错误。 2. 错误原因:基于引用[2],KEY不正确。 3. 解决步骤: - 步骤1: 找到正确的KEY。 - 步骤2: 确保流程已部署。 - 步骤3: 在代码中使用正确的KEY。 4. 引用:自然地添加引用标识。 5. 生成相关问题。 确保回答清晰、逐步解决问题。 相关问题生成: - 基于主题,比如Activiti部署、错误处理等。 - 例如:如何避免KEY混淆?如何查询部署的流程?Activiti部署流程的最佳实践? 最后,添加“§§相关问题§§”部分。 </think> ### 解决 org.activiti.engine.ActivitiObjectNotFoundException: no processes deployed with key 错误的方法 该错误表明 Activiti 引擎找不到与指定 KEY 值匹配的已部署流程定义。KEY 值 'Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c' 不正确或未部署,导致引擎无法加载对应的流程。以下是基于常见原因和引用信息的逐步解决方法: #### 错误原因分析 - **KEY 值不正确**:Activiti 要求 KEY 必须是流程图的唯一标识符(ID),而不是流程名称或其他属性。常见的混淆是将流程部署时的名称(name)当作 KEY 使用,但 KEY 值实际来源于流程图的 Properties 属性中的 ID 字段[^2]。 - **流程未部署成功**:KEY 存在但没有对应的部署记录,可能因为部署操作失败或未执行。 - **KEY 值格式问题**:KEY 值通常是 UUID 格式(如 'Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c'),如果错误使用了大小写、空格或特殊字符,也会导致匹配失败[^2]。 #### 解决步骤 按照以下顺序检查和修复问题,确保过程清晰可靠: 1. **确认 KEY 值的正确来源**: - 打开 Activiti Modeler(或流程图设计工具),右键点击流程图,选择 "Properties"。 - 在属性面板中,查找 "ID" 字段(例如 `Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c`)。这个 ID 值就是正确的 KEY,不是 "name" 或其他字段[^2]。 - 如果流程图已部署,但不确定 KEY,查询数据库表 `ACT_RE_PROCDEF`: - 使用 SQL: `SELECT KEY_ FROM ACT_RE_PROCDEF WHERE DEPLOYMENT_ID_ = 'your_deployment_id'`。替换 `your_deployment_id` 为实际部署 ID(从部署代码或日志中获取)[^2]。 2. **检查流程部署状态**: - 确保流程已成功部署。在代码中,部署流程通常使用 `repositoryService.createDeployment()` 方法。示例代码(Java): ```java Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/your-process.bpmn") // 指定 BPMN 文件路径 .deploy(); String key = deployment.getKey(); // 获取部署后的 KEY,用于后续验证 ``` - 部署后,检查日志是否有错误输出。如果部署失败(如文件路径错误或数据库连接问题),KEY 将不存在[^1]。 - 验证部署:运行 `repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).singleResult()`,如果返回 `null`,说明部署失败。 3. **修复代码中的 KEY 使用**: - 在启动流程或查询时,确保使用正确的 KEY 值(来自步骤1)。例如: ```java // 正确方式:使用 ID 属性作为 KEY runtimeService.startProcessInstanceByKey("Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c"); ``` - 避免硬编码 KEY:推荐从配置文件或数据库动态加载 KEY,减少人为错误。 - 如果 KEY 值包含 UUID,确保字符串完全匹配(包括大小写和连字符)。例如,'Process_A4D0...' 与 'Process_a4d0...' 会被视为不同值。 4. **测试和验证**: - 部署后,查询 `ACT_RE_PROCDEF` 表确认 KEY 存在:`SELECT * FROM ACT_RE_PROCDEF WHERE KEY_ = 'Process_a4d0ad53-1057-4ec7-96ba-9622d9581d7c'`。 - 在测试环境中重启应用,观察是否成功启动流程。如果错误消失,表示修复有效。 #### 注意事项 - **数据库一致性**:确保 Activiti 数据库表(如 `ACT_RE_PROCDEF`)没有被手动修改,以避免 KEY 不一致[^2]。 - **部署脚本**:在项目启动时自动执行部署逻辑(如使用 Spring Boot 的监听器),防止遗漏部署[^1]。 - **日志监控**:启用详细日志(如设置 `logging.level.org.activiti=DEBUG`),捕获部署过程中的错误细节。 通过以上步骤,大多数 KEY 错误都可以解决。如果问题 persist,检查 Activiti 版本兼容性或数据库连接问题[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值