

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 连续工作流程
<a name="continuous"></a>

在某些使用案例中，您可能需要使用永远执行或长时间运行的工作流程，例如，监控服务器队列运行状况的工作流程。

**注意**  
由于 Amazon SWF 保留了工作流程执行的全部历史记录，因此历史记录将随着时间的推移而不断增长。在执行重播时，该框架从 Amazon SWF 中检索该历史记录，如果历史记录太大，这会产生高昂的成本。在这种长时间运行或连续工作流程中，您应该定期关闭当前执行并启动新的执行以继续处理。

 这是工作流程执行的逻辑延续。可以将生成的自客户端用于该目的。在您的工作流程实现中，直接在自客户端上调用 `@Execute` 方法。在当前执行完成后，该框架将使用相同的工作流程 ID 启动新的执行。

您也可以在可从当前 `DecisionContext` 中检索的 `GenericWorkflowClient` 上调用 `continueAsNewOnCompletion` 方法以继续执行。例如，以下工作流程实现设置一个计时器以在一天后触发，并调用自己的入口点以启动新的执行。

```
public class ContinueAsNewWorkflowImpl implements ContinueAsNewWorkflow {

    private DecisionContextProvider contextProvider
         = new DecisionContextProviderImpl();

    private ContinueAsNewWorkflowSelfClient selfClient
         = new ContinueAsNewWorkflowSelfClientImpl();

    private WorkflowClock clock
         = contextProvider.getDecisionContext().getWorkflowClock();

    @Override
    public void startWorkflow() {
        Promise<Void> timer = clock.createTimer(86400);
        continueAsNew(timer);
    }

    @Asynchronous
    void continueAsNew(Promise<Void> timer) {
        selfClient.startWorkflow();
    }
}
```

在工作流程递归调用自身时，该框架将在所有待办任务完成时关闭当前工作流程，并启动新的工作流程执行。请注意，只要具有待办任务，就不会关闭当前工作流程执行。新执行不会从原始执行中自动继承任何历史记录或数据；如果要将某种状态转移到新执行，您必须显式将其作为输入传递。