簡體   English   中英

特定條件下的AWS SWF重新啟動工作流程

[英]AWS SWF Restart workflow under specific conditions

我有一個SWF工作流程和活動。 下面是結構:

WorkflowClientImpl類:

 class TempWorkflowImpl() {
     @Override 
     public void execute() {
           new TryCatchFinallly {
                 @Override
                 protected void doTry() throws Throwable {
                        activityClient.invoke();
                 }
                 @Override
                 protected void doFinally() throws Throwable {
                        // Clean up code
                 }
                 @Override
                 protected void doCatch() throws Throwable {
                        // Handle Exception
                 }                    
           }
     } 
 }

ActivityClientImpl類:

 class TempActivityImpl()  {
     @Override 
     public void invoke() {
         // Perform some logic
         // Check if API call (API_Call_A) is made previously
         // If not Invoke API_Call_A.
         // If yes, throw exception  

     }
 }

活動類進行一個異步方法的API調用。 API調用中定義的操作大約需要一個小時才能完成。 有時,由於某些原因,動作在執行時可能會失敗。 此API調用是在我無權訪問的服務上定義的。 有什么方法可以讓我休眠該活動,以便可以在一個小時后檢查該操作是否成功。 如果不成功,我將重新調用API調用。 讓我們假設這次動作將成功,並且我們不會陷入API調用嘗試的無限循環中。

Thread.sleep()似乎是一種方法,盡管我不確定這是最合適的方法。 我還發現我們可以使用重新啟動整個工作流程

 Promise<Void> timer = decisionContextProvider.getDecisionContext().getWorkflowClock().createTimer(TimeUnit.MINUTES.toSeconds(TimeinMinutes));
 continueAsNew(timer);

要使用上述方法,我可以在調用API之后從活動方法返回TimeinMinutes的值,然后在一個小時后重新啟動工作流程。

以上方法最合適嗎? 還是有更好的方法來做到這一點?

謝謝

除非您的工作流歷史記錄很長(例如,在調用活動100次之后),否則無需調用continueAsNew。 只需使用@Asynchronous方法或Task來等待諾言。 我會將您的工作流建模為兩個活動:調用和checkResult,並在延遲后執行checkResult,並使用@ExponentialResult重試它直到結果可用。

class TempWorkflowImpl() {
   private final WorkflowClock clock = decisionContextProvider.getDecisionContext().getWorkflowClock()
   @Override 
   public void execute() {
       new TryCatchFinallly {
             @Override
             protected void doTry() throws Throwable {
                   invoke();
             }
             @Override
             protected void doFinally() throws Throwable {
                    // Clean up code
             }
             @Override
             protected void doCatch() throws Throwable {
                    // Handle Exception
             }                    
       }
   } 

   @Asynchronous
   // On ServiceFailureException retry from the beginning
   @ExponentialRetry(initialRetryIntervalSeconds=300, exceptionsToRetry=ServiceFailureException.class) 
   private Promise<ResultType>  invoke() {
                    Promise<Void> invoked = activityClient.invoke();
                    Promise<ResultType> result = checkResultAfterDelay(invoked);
                    processResult(result);
   }

   @Asynchronous
   private Promise<ResultType>  checkResultAfterDelay(Promise<Void> invoked) {
      Promise<Void> timer = clock.createTimer(TimeUnit.MINUTES.toSeconds(60));
      return checkResult(timer);
   }

   @Asynchronous
   // Automatically retry on ResultUnavailableException
   @ExponentialRetry(initialRetryIntervalSeconds=300, exceptionsToRetry=ResultUnavailableException.class) 
   private Promise<ResultType> checkResult(Promise<Void> timer) {
      return activityClient.checkResult();
   }

   @Asynchronous
   private processResult(Promise<ResultType>  result) {
     ....
   }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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