activiti 更新act_hi_taskinst表DELETE_REASON_

本文介绍如何在Activiti流程引擎中通过定制命令类来更新历史任务实例的删除原因,确保流程跟踪的准确性。具体实现了UpdateHiTaskReasonCommand类,用于在任务被撤销或跳转时设置特定的DELETE_REASON_值。

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

 

由于activiti对于act_hi_taskinst表中的DELETE_REASON_列值是有限的,DELETE_REASON_类代表任务的完成原因,比如completed或者delete,因此我们在任意节点跳转或者撤销的时候,必须标记该字段,比如撤销可以标记可以定义为Revoke、跳转可以标记为jump等等。

写一个命令类如下:

public class UpdateHiTaskReasonCommand implements Command {
	protected String taskId;
	protected String deleteReason;

	public UpdateHiTaskReasonCommand(String taskId, String deleteReason) {
		this.taskId = taskId;
		this.deleteReason = deleteReason;
	}
	@Override
	public Void execute(CommandContext commandContext) {
		HistoricTaskInstanceEntity historicTaskInstance = commandContext
				.getDbSqlSession().selectById(HistoricTaskInstanceEntity.class,taskId);
		if (historicTaskInstance != null) {
			historicTaskInstance.markEnded(deleteReason);
		}
		return null;
	}
}

关于historicTaskInstance.markEnded(deleteReason)操作之后数据库的数据就会更新,可以参考Activiti权威指南一书中的会话缓存章节

 

### 修改 `act_hi_taskinst` 中的 `NAME_` 字段 在Activiti BPMN环境中,当希望在流程实例提交修改后更新历史任务实例(`act_hi_taskinst`)中的`NAME_`字段时,可以通过监听器(Listener)机制实现这一需求。具体来说,在流程定义中配置任务完成事件监听器来捕获任务状态变更,并在此基础上执行自定义逻辑以更新数据库记录。 为了达到上述目的,可以采用如下方式: #### 使用Java Delegate Listener 实现自动更新功能 1. 创建一个新的类继承自`org.activiti.engine.delegate.JavaDelegate`接口,并重写其中的方法。 ```java public class UpdateTaskNameListener implements JavaDelegate { @Override public void execute(DelegateExecution execution){ String taskId = (String)execution.getVariable("taskId"); HistoryService historyService = ((ProcessEngineServices)execution.getEngineServices()).getHistoryService(); Task task = historyService.createHistoricTaskInstanceQuery() .taskId(taskId) .singleResult(); if(task != null && !StringUtils.isEmpty(execution.getVariable("newTaskName"))){ // 更新操作应通过activiti提供的API而非直接SQL语句, // 这里仅作为概念验证展示如何获取所需信息 System.out.println("Updating Name of historic task instance with id " + taskId); System.out.println("New name will be set to:" + execution.getVariable("newTaskName")); // 注意:实际应用中需调用相应服务方法或利用扩展点进行安全可靠的更新处理 } } } ``` 2. 将创建好的监听器注册到BPMN文件的任务节点上,指定其为任务完成后触发的事件处理器。 ```xml <serviceTask id="updateTaskInfo" activiti:class="com.example.UpdateTaskNameListener"> <!-- 配置传递给监听器的相关参数 --> <extensionElements> <activiti:field name="taskId"><activiti:string><![CDATA[${task.id}]]></activiti:string></activiti:field> <activiti:field name="newTaskName"><activiti:string><![CDATA[${updatedName}]]></activiti:string></activiti:field> </extensionElements> </serviceTask> ``` 需要注意的是,以上代码片段仅为示意用途,展示了如何基于特定条件动态更改已存档的历史任务名称[^1]。然而,由于`act_hi_taskinst`属于只读性质的历史数据,官方并不建议直接对其进行DML(Data Manipulation Language)操作;因此推荐的方式是在业务层面维护额外的日志或者映射关系以便追踪任何必要的元数据变动情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值