[英]SWF: End workflow based on Promise
我有一個調用活動的決策者。 活動返回驗證錯誤列表。 如果決策者收到該列表並且它不是空的,我想退出工作流程。
要退出工作流程,我只需返回決策程序,它就會退出工作流程。 問題是我無法從活動中獲得結果。 我希望這可以工作,但它沒有.. violation.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
}
}
我不想做其他方法來調查violation.isReady()是否為true,因為這會占用決策者線程誰知道多長時間。 我甚至不確定這是否有效。
救命?
工作流代碼是異步的。 因此,從活動返回的Promise永遠不會在同一個回調中准備好。 所以在你的代碼中, violation.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
}
}
請注意, 應使用Flow Framework Aspects 正確配置 AspectJ以使@Asynchronous批注生效。
另一種選擇是直接使用Task:
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食譜和樣本 ,以便更好地了解編寫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) {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.