gpt4 book ai didi

java - AWS SWF 在特定条件下重新启动工作流程

转载 作者:行者123 更新时间:2023-12-01 09:34:50 25 4
gpt4 key购买 nike

我有一个 SWF 工作流程和 Activity 。结构如下:

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

}
}

Activity 类使用异步方法进行 API 调用。 API 调用中定义的操作大约需要一个小时才能完成。有时,由于某些原因,操作在执行时可能会失败。此 API 调用是在我无权访问的服务上定义的。有没有办法让我 hibernate 该 Activity ,以便在一小时后检查该操作是否成功。如果不成功,我将重新调用 API 调用。让我们假设这次操作将成功,并且我们不会陷入 API 调用尝试的无限循环中。

Thread.sleep() 似乎是一种方法,尽管我不确定这是最合适的方法。我还发现我们可以使用

重新启动整个工作流程
 Promise<Void> timer = decisionContextProvider.getDecisionContext().getWorkflowClock().createTimer(TimeUnit.MINUTES.toSeconds(TimeinMinutes));
continueAsNew(timer);

要使用上述内容,我可以在 API 调用后从 Activity 方法返回 TimeinMinutes 值,然后在一小时后重新启动工作流程。

上述方法最合适吗?或者有更好的方法吗?

谢谢

最佳答案

除非您的工作流程历史记录很大(例如调用 Activity 100 次后),否则无需调用 continueAsNew。只需使用 @Asynchronous 方法或 Task 来等待 Promise。我会将您的工作流程建模为两个 Activity :调用和 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) {
....
}

}

关于java - AWS SWF 在特定条件下重新启动工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088587/

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