如何从与给定状态关联的任务重新启动工作流
How to Restart a Workflow From the Task Associated With a Given Status
我需要创建一个工作流,让用户可以从数据库中检索实体、审查它,最后批准或放弃它。如果用户批准该实体,应用程序仅将其状态更新为 APPROVED
,否则如果用户放弃该实体,应用程序将其状态更新为 DISCARDED
.
当新实体存储到数据库中时,其状态默认为 DRAFT
。当用户开始审查实体时,状态将设置为 IN_REVIEW
– 审查可能会持续几天。
为了实现工作流程,我定义了以下 JavaDelegate
类:
public class ReviewEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to IN_REVIEW and update DB
}
}
public class ApproveEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to APPROVED and update DB
}
}
public class DiscardEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to DISCARDED and update DB
}
}
然后,查看官方文档,工作流程应该是这样设置的:
@Service
public class MyWorkflowService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
public void startProcess(Article article) {
Map<String, Object> variables = new HashMap<>();
...
runtimeService.startProcessInstanceByKey("entityReview", variables);
}
public void updateOnReview(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("review", myEntity.getStauts == "IN_REVIEW");
taskService.complete(myEntity.getId(), variables);
}
public void updateOnApprove(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("approved", myEntity.getStauts == "APPROVED");
taskService.complete(myEntity.getId(), variables);
}
public void updateOnDiscard(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("discarded", myEntity.getStauts == "DISCARDED");
taskService.complete(myEntity.getId(), variables);
}
}
在 运行 任何任务之前,我需要调用 runtimeService.startProcessInstanceByKey
来启动进程。所以我的问题是:如何从给定的 [previous] 状态重新启动工作流?例如,假设今天我通过调用 updateOnReview
(状态转到 IN_REVIW
)开始审查......两天后我将通过调用 updateOnApprove
(状态转到 APPROVED
),我应该如何调用 runtimeService.startProcessInstanceByKey
以从我之前离开的任务(即与状态 IN_REVIEW
关联的任务)开始工作流?谢谢。
根据我对您的场景的理解,您之前启动的流程实例现在正在用户任务中等待更新。您使用 taskService 完成用户任务并提交数据更新。您的问题是如何将更新操作与正确的 运行ning 实例相匹配。
当您启动流程实例时,您需要包含一个唯一标识符,稍后可用于此匹配。自然的选择是实体 ID。您可以将其包含在流程数据中,但将其设置为 businssKey 会更好。
https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/RuntimeService.html#startProcessInstanceById(java.lang.String)
稍后,当您需要更新流程实例时,您可以使用 TaskService 运行 以 businessKey(或流程数据)作为搜索条件的查询。
https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/TaskService.html#createTaskQuery()
查询将return您属于正确流程实例的用户任务。现在您可以使用 TaskService 和 returned 任务的 ID(不是您的实体的 ID)完成此用户任务。
我需要创建一个工作流,让用户可以从数据库中检索实体、审查它,最后批准或放弃它。如果用户批准该实体,应用程序仅将其状态更新为 APPROVED
,否则如果用户放弃该实体,应用程序将其状态更新为 DISCARDED
.
当新实体存储到数据库中时,其状态默认为 DRAFT
。当用户开始审查实体时,状态将设置为 IN_REVIEW
– 审查可能会持续几天。
为了实现工作流程,我定义了以下 JavaDelegate
类:
public class ReviewEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to IN_REVIEW and update DB
}
}
public class ApproveEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to APPROVED and update DB
}
}
public class DiscardEntityTask implements JavaDelegate {
public void execute(DelegateExecution execution) {
// set entity status to DISCARDED and update DB
}
}
然后,查看官方文档,工作流程应该是这样设置的:
@Service
public class MyWorkflowService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
public void startProcess(Article article) {
Map<String, Object> variables = new HashMap<>();
...
runtimeService.startProcessInstanceByKey("entityReview", variables);
}
public void updateOnReview(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("review", myEntity.getStauts == "IN_REVIEW");
taskService.complete(myEntity.getId(), variables);
}
public void updateOnApprove(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("approved", myEntity.getStauts == "APPROVED");
taskService.complete(myEntity.getId(), variables);
}
public void updateOnDiscard(final MyEntity myEntity) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("discarded", myEntity.getStauts == "DISCARDED");
taskService.complete(myEntity.getId(), variables);
}
}
在 运行 任何任务之前,我需要调用 runtimeService.startProcessInstanceByKey
来启动进程。所以我的问题是:如何从给定的 [previous] 状态重新启动工作流?例如,假设今天我通过调用 updateOnReview
(状态转到 IN_REVIW
)开始审查......两天后我将通过调用 updateOnApprove
(状态转到 APPROVED
),我应该如何调用 runtimeService.startProcessInstanceByKey
以从我之前离开的任务(即与状态 IN_REVIEW
关联的任务)开始工作流?谢谢。
根据我对您的场景的理解,您之前启动的流程实例现在正在用户任务中等待更新。您使用 taskService 完成用户任务并提交数据更新。您的问题是如何将更新操作与正确的 运行ning 实例相匹配。
当您启动流程实例时,您需要包含一个唯一标识符,稍后可用于此匹配。自然的选择是实体 ID。您可以将其包含在流程数据中,但将其设置为 businssKey 会更好。 https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/RuntimeService.html#startProcessInstanceById(java.lang.String)
稍后,当您需要更新流程实例时,您可以使用 TaskService 运行 以 businessKey(或流程数据)作为搜索条件的查询。 https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/TaskService.html#createTaskQuery()
查询将return您属于正确流程实例的用户任务。现在您可以使用 TaskService 和 returned 任务的 ID(不是您的实体的 ID)完成此用户任务。