簡體   English   中英

SWF:基於Promise結束工作流程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM