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