gpt4 book ai didi

java - SWF : End workflow based on Promise

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:06 24 4
gpt4 key购买 nike

我有一个调用 Activity 的决策程序。该 Activity 返回验证错误列表。如果决策者收到该列表并且它不为空,我想退出工作流。

要退出工作流程,我可以在决策程序中返回,它会退出工作流程。问题是我无法从 Activity 中获得结果。我原以为这会起作用,但它不会.. violations.isReady() 总是返回 false:

public class WorkflowImpl implements Workflow {
ActivitiesClient activities;

public Workflow(/*...*/) {
// ...
}

@Override
public void do(WorkflowInput input) {
Promise<List<String>> violations = activities.validate(input);

if (!violations.isReady()) { // "do()" will be called when violations is ready.. right?
return;
} else if (!CollectionUtils.isEmpty(violations.get())) {
return; // or throw ValidationException
}

// do other stuff
}
}

我不想做替代方案,即轮询 violations.isReady() 是否为真,因为这会占用决策者线程,谁知道会占用多长时间。我什至不确定这是否可行。

帮忙吗?

最佳答案

工作流代码是异步的。所以一个Promise从 Activity 返回的内容永远不会在同一个回调 中准备就绪。所以在你的代码中 violations.isReady() 总是返回 false 是正确的行为。您必须使用注释为 @Asynchronous 或 Task 的方法将 回调 关联到 Promise。所以你的代码应该是这样的:

public class WorkflowImpl implements Workflow {
ActivitiesClient activities;

public Workflow(/*...*/) {
// ...
}

@Override
public void do(WorkflowInput input) {
Promise<List<String>> violations = activities.validate(input);
processValidationResult(violations);
}

@Asynchronous
private void processValidationResult(Promise<List<String>> violations) {
// As method is @Asynchronous framework guarantees violations is ready
// when its body is executed.
if (!CollectionUtils.isEmpty(violations.get())) {
return; // or throw ValidationException
}
// do other stuff
}
}

注意 AspectJ should be configured correctly使用 Flow Framework Aspects 使 @Asynchronous 注释生效。

另一种选择是直接使用任务:

public class WorkflowImpl implements Workflow {
ActivitiesClient activities;

public Workflow(/*...*/) {
// ...
}

@Override
public void do(WorkflowInput input) {
Promise<List<String>> violations = activities.validate(input);
new Task(violations) {
@Override
public void doExecute() {
// Framework guarantees violations is ready
// (as it is Task constructor parameter)
// when execute method is executed.
if (!CollectionUtils.isEmpty(violations.get())) {
return; // or throw ValidationException
}
// do other stuff
}
};
}
}

我建议通读 SWF Recipessamples更好地了解编写 SWF 工作流时使用的模式。

还要确保你通过了TryCatchFinally javadoc作为 AWS Flow Framework 错误处理虽然非常强大,但与大多数人习惯的完全不同。

添加以显示从 processValidationResult(...) 返回值的示例:

  @Override
public void do(WorkflowInput input) {
Promise<List<String>> violations = activities.validate(input);
Promise<String> whatever = processValidationResult(violations);
processNextStep(whatever);
}

@Asynchronous
private Promise<String> processValidationResult(Promise<List<String>> violations) {
// As method is @Asynchronous framework guarantees violations is ready
// when its body is executed.
if (!CollectionUtils.isEmpty(violations.get())) {
throw new ValidationException(...);
}
// do other stuff
return Promise.asPromise("result string");
}

@Asynchronous
private void processNextStep(Promise<String> whatever) {
...
}

关于java - SWF : End workflow based on Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com