我有一个流程,我有3个连续的用户任务(类似于任务1 - >任务2 - >任务3)。因此,为了验证任务3,我必须验证任务1,然后验证任务2。
我的目标是通过此link中建议的命令,实施一种解决方法,以返回执行流程实例。问题是我开始实现命令它不能按我的意愿工作。算法应该是这样的:
所以,我的命令代码是这样的:
public class MoveTokenCmd implements Command<Void> {
protected String fromTaskId = "20918";
public MoveTokenCmd() {
}
public Void execute(CommandContext commandContext) {
HistoricTaskInstanceEntity currentUserTaskEntity = commandContext.getHistoricTaskInstanceEntityManager()
.findHistoricTaskInstanceById(fromTaskId);
ExecutionEntity currentExecution = commandContext.getExecutionEntityManager()
.findExecutionById(currentUserTaskEntity.getExecutionId());
// Get process Instance
HistoricProcessInstanceEntity historicProcessInstanceEntity = commandContext
.getHistoricProcessInstanceEntityManager()
.findHistoricProcessInstance(currentUserTaskEntity.getProcessInstanceId());
HistoricTaskInstanceQueryImpl historicTaskInstanceQuery = new HistoricTaskInstanceQueryImpl();
historicTaskInstanceQuery.processInstanceId(historicProcessInstanceEntity.getId()).orderByExecutionId().desc();
List<HistoricTaskInstance> historicTaskInstances = commandContext.getHistoricTaskInstanceEntityManager()
.findHistoricTaskInstancesByQueryCriteria(historicTaskInstanceQuery);
int index = 0;
for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
if (historicTaskInstance.getId().equals(currentUserTaskEntity.getId())) {
break;
}
index++;
}
if (index > 0) {
HistoricTaskInstance previousTask = historicTaskInstances.get(index - 1);
TaskEntity newTaskEntity = createTaskFromHistoricTask(previousTask, commandContext);
currentExecution.addTask(newTaskEntity);
commandContext.getTaskEntityManager().insert(newTaskEntity);
AtomicOperation.TRANSITION_CREATE_SCOPE.execute(currentExecution);
} else {
// TODO: find the last task of the previous process instance
}
// To overcome the "Task cannot be deleted because is part of a running
// process"
TaskEntity currentUserTask = commandContext.getTaskEntityManager().findTaskById(fromTaskId);
if (currentUserTask != null) {
currentUserTask.setExecutionId(null);
commandContext.getTaskEntityManager().deleteTask(currentUserTask, "jumped to another task", true);
}
return null;
}
private TaskEntity createTaskFromHistoricTask(HistoricTaskInstance historicTaskInstance,
CommandContext commandContext) {
TaskEntity newTaskEntity = new TaskEntity();
newTaskEntity.setProcessDefinitionId(historicTaskInstance.getProcessDefinitionId());
newTaskEntity.setName(historicTaskInstance.getName());
newTaskEntity.setTaskDefinitionKey(historicTaskInstance.getTaskDefinitionKey());
newTaskEntity.setProcessInstanceId(historicTaskInstance.getExecutionId());
newTaskEntity.setExecutionId(historicTaskInstance.getExecutionId());
return newTaskEntity;
}
}
但问题是我可以看到我的任务已创建,但执行并未指向它,而是指向当前的任务。
我有想法使用活动(通过对象ActivityImpl)将其设置为执行但我不知道如何检索新任务的活动。
有人可以帮助我吗?
答案 0 :(得分:0)
除非引擎中的某些东西发生了显着变化,否则您引用的链接中的代码仍然可以工作(我在许多项目中使用过它)。 也就是说,在扫描代码时,我看不到最重要的命令。
执行当前执行后,您可以通过设置当前活动来移动令牌。
就像我说的那样,引用文章中的代码曾经工作过但仍然应该。 格雷格
答案 1 :(得分:0)
在您的问题中引用相同的链接,我个人建议您使用您的流程设计。使用专用网关来决定进程是应该结束还是应该返回到上一个任务。如果任务的生成是动态的,则可以指向同一任务并删除局部变量。 Activiti有一些结构可以节省您实施相同的时间:)。