当前位置: 首页 > 知识库问答 >
问题:

Activiti:从特定步骤重新启动流程

华福
2023-03-14

我正在使用activiti 6为我们的一个项目设计业务流程。这个过程非常简单,它由“用户任务”或“服务任务”的数量以及基于角色的分配组成。然而,我们的客户希望管理员用户能够在任何时间点重新运行之前的任何“用户任务”或“服务任务”。

例如,以下是我的流程:

开始-

客户端希望在流程执行期间的任何时间点,管理员用户都应该能够将工作流执行从:例如状态“User-Task8”更改为Service-Task1或User-Task2或Service-Task3或User-Task4或Service-Task5或User-Task6或Service-Task7中的任何一个。

根据Alfresco社区线程:用户任务回滚

我创建了一个自定义命令作为

public class RestartInstanceActivitiCommand implements Command<Void> { 
   private final String executionId;
   private final FlowElement flowElement;

   public RestartInstanceActivitiCommand(String executionId, FlowElement flowElement) {
      this.executionId = executionId;
      this.flowElement = flowElement;
   }

   public Void execute(CommandContext commandContext) {
      ExecutionEntity execution = commandContext.getExecutionEntityManager().findById(this.executionId); 
      execution.setCurrentFlowElement(flowElement); 
      return null;
   }
}

并以以下方式执行:

BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
FlowElement flowElement = bpmnModel.getFlowElement("Service-Task1");
commandExecutor.execute(new RestartInstanceActivitiCommand(processInstanceId, flowElement));
runtimeService.trigger(processInstanceId);

这样,当前任务设置为Service-Task1,但它不会像正常流那样自动执行。此外,我可以看到User-Task8也处于活动状态,并分配给了我不想要的用户,因为我想取消当前任务并从所需步骤重新运行它。

感谢您对代码示例的帮助。

你好Sandip

共有2个答案

易成双
2023-03-14

如果返回步骤A是工作流过程的一部分,也许最好将其包含在您的工作流树中。

因此,查看过滤器是您的验证步骤,之后您将实现独占网关。

独占网关将允许您在工作流中构建类似于“如果其他情况”的条件。

专用网关(也称为XOR网关或更专业的专用基于数据的网关)用于对流程中的决策进行建模。当执行到达该网关时,所有传出序列流都将按照定义顺序进行评估。选择条件求值为true(或没有条件集,概念上在序列流上定义了“true”)的序列流以继续该过程。

以及相应的XML表示:

<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" />

<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
  <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
  <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
  <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>

在您的情况下:

<代码>开始-

如果获得批准-

其他转到:-

当完成任务时,您可以将条件变量作为键值对传递给Activiti进程(Map):

boolean approved = true;
variableMap.put("input", approved);
taskService.complete(task.getId(), variableMap);

关于专用网关的问题可能有用。

上官迪
2023-03-14

我写了一个简单的命令方法,应该可以实现您想要做的事情。您可以在AlFresco论坛上的以下线程中找到答案:

https://community.alfresco.com/thread/224300-user-task-rollback

 类似资料:
  • 我有下面的 Dockerfile。 在构建映像时,它在步骤 23 中失败,即 现在,当我重建它时,它从步骤 23 开始构建,因为 docker 正在使用缓存。 但是如果我想从步骤21重建图像,即 我该怎么做呢?删除缓存的图像是唯一的选择吗?有没有额外的参数可以做到这一点?

  • 问题内容: 我有下面的Dockerfile。 构建图像时,它在步骤23中失败,即 现在,当我重建时,由于docker使用缓存,它从步骤23开始构建。 但是,如果我想从步骤21重建图像,即 我怎样才能做到这一点?删除缓存的图像是唯一的选择吗?是否有其他参数可以做到这一点? 问题答案: 您可以通过执行以下操作来重建整个内容,而无需使用缓存 要强制从特定行开始重新运行,可以传递一个未使用的arg。Doc

  • 我有一个可流动的工作流,我需要在某个阶段暂停,然后根据JMS消息从JMS监听器重新启动相同的工作流。

  • 我在应用程序中使用Activiti框架。Activiti通过Activiti API进行管理。 真是个问题: 我需要重新启动服务器wtih应用程序。这意味着两件事: 我需要正确暂停/停止所有活动 目前,我的应用程序已通过系统停止。退出(0) 问题: 我怎么会那样做呢?(意指以上两项) System.exit(0)会遇到什么问题? 编辑: 是的,谢谢。但我使用嵌入式Activiti。这些适用于嵌入式

  • 我使用以下逻辑重新启动Spring批处理未完成(例如,在应用程序异常终止后)作业: 这很好,但有一个副作用——它不会重新启动失败的作业执行,而是创建一个新的执行实例。如何更改这个逻辑,以便从失败的步骤重新启动失败的执行,而不创建新的执行? 更新 当我尝试以下代码时: 它失败,但出现以下异常: 以下代码在jobstore数据库中创建新的执行: 问题是——在应用程序重启后,如何在不创建新执行的情况下继

  • 我试图从步骤(实现接口Tasklet的类的execute方法)内部启动作业。 显然我收到了例外 Java语言lang.IllegalStateException:在JobRepository中检测到现有事务 如何使Spring批处理步骤不是事务性的? 有人能解决我从一步内启动工作的主要需求吗? 提前感谢您的帮助!