activiti通过key获取processDefinitionId
时间: 2024-05-03 13:23:10 浏览: 130
在 Activiti 中,可以使用 `RepositoryService` 的 `createProcessDefinitionQuery()` 方法来创建一个查询对象,然后使用 `processDefinitionKey()` 方法来指定流程定义的 key,最后调用 `singleResult()` 方法获取单个流程定义对象,从而获取流程定义的 ID。
示例代码:
```java
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myProcess")
.singleResult();
String processDefinitionId = processDefinition.getId();
```
相关问题
activiti6 如何配置标识key 使用java代码实现
首先,需要在项目中引入 activiti-engine 和 activiti-spring 两个依赖。然后,在 Spring 配置文件中,配置一个 ProcessEngineConfigurationImpl 的 bean,并设置好数据库连接等信息。配置如下:
```xml
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="true"/>
<property name="jobExecutorActivate" value="false"/>
<property name="asyncExecutorActivate" value="false"/>
<property name="history" value="full"/>
<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="processDiagramGenerator">
<bean class="org.activiti.image.impl.DefaultProcessDiagramGenerator"/>
</property>
</bean>
```
然后,在代码中使用如下方式来获取 ProcessEngine 对象,并从中获取 RepositoryService 对象:
```java
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
```
接下来,就可以使用 RepositoryService 对象来管理流程定义了。例如,可以通过以下方式来部署流程定义并获取流程定义的 id:
```java
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("processes/my-process.bpmn20.xml")
.deploy();
String processDefinitionId = deployment.getDeployedArtifacts().get(0).getId();
```
至于如何配置标识 key,可以在流程定义的 XML 文件中通过添加 ExtensionElements 来实现。例如:
```xml
<bpmn:process id="my-process" name="My Process">
<bpmn:extensionElements>
<activiti:executionListener event="start" class="com.example.MyStartExecutionListener" />
<activiti:taskListener event="create" class="com.example.MyCreateTaskListener" />
<activiti:variableListener event="create" class="com.example.MyCreateVariableListener" />
<activiti:identityLinkType activiti:identityLinkTypeName="boss" activiti:extensionName="boss" activiti:extensionElement="boss"/>
</bpmn:extensionElements>
...
</bpmn:process>
```
在这个例子中,添加了一个 identityLinkType,其被用来配置一个叫做 "boss" 的标识 key。其他的监听器和变量监听器也可以使用类似的方式添加。
activiti判断节点是否是会签节点
### 判断 Activiti 工作流中的会签节点
在 Activiti 工作流引擎中,可以通过分析 `BpmnModel` 和 `Execution` 对象来判断某个节点是否为会签节点。具体来说:
#### 使用 BpmnModel 实现
通过解析 BPMN 模型文件,可以获取流程定义的相关信息。对于多实例任务或多参与者任务(即会签任务),这些任务通常会在 XML 文件中有特定标记。
```java
// 获取流程定义ID
String processDefinitionId = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult()
.getProcessDefinitionId();
// 加载模型
RepositoryService repositoryService = processEngine.getRepositoryService();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
// 遍历所有活动找到目标节点
FlowElement flowElement = bpmnModel.getMainProcess().getFlowElement(activityId);
if (flowElement instanceof UserTask) {
MultiInstanceLoopCharacteristics multiInstance = ((UserTask) flowElement).getMultiInstanceLoopCharacteristics();
if (multiInstance != null && "parallel".equals(multiInstance.getCompletionCondition())) {
System.out.println("这是一个并行的会签节点");
}
}
```
上述代码展示了如何利用 `BpmnModel` 来识别一个多实例用户任务,并进一步确认其是否属于平行模式下的会签操作[^1]。
#### 查询运行时数据表实现
另一种方法是从数据库查询正在执行的任务列表及其属性来进行判定。当一个任务被配置成由多个参与方共同完成时,在某些情况下可以在 `ACT_RU_TASK` 表中看到相同父级执行路径下存在多个未结束的任务记录;而在历史表 `ACT_HI_ACTINST` 或者 `ACT_HI_TASKINST` 中则可能观察到具有相似特征的历史条目。
```sql
SELECT COUNT(*), T.ASSIGNEE_
FROM ACT_RU_TASK AS T
JOIN ACT_RU_EXECUTION E ON T.EXECUTION_ID_ = E.ID_
WHERE E.PARENT_ID_ IS NOT NULL AND T.TASK_DEF_KEY_='your-task-def-key'
GROUP BY T.ASSIGNEE_;
```
此 SQL 片段用于统计指定任务定义键名下的活跃任务数量以及分配给谁负责。如果有超过一条记录返回,则表明这很可能是一个正在进行中的会签环节[^2]。
另外需要注意的是,实际应用环境中还需要考虑其他因素如自定义行为扩展等可能导致的行为差异。因此建议结合具体的业务逻辑和部署环境做适当调整。
阅读全文
相关推荐
















