

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

# 守护程序任务
<a name="daemontasks"></a>

 AWS Flow Framework 适用于 Java 的允许将某些任务标记为`daemon`。这将允许您创建执行某项后台工作的任务，在完成所有其他工作时将取消这些任务。例如，在完成工作流程的其他任务时，将取消运行状况监控任务。您可以通过在异步方法或 `TryCatchFinally` 实例上设置 `daemon` 标志来做到这一点。在以下示例中，异步方法 `monitorHealth()` 将标记为 `daemon`。

```
public class MyWorkflowImpl implements MyWorkflow {
  MyActivitiesClient activitiesClient = new MyActivitiesClientImpl();

  @Override
  public void startMyWF(int a, String b) {
    activitiesClient.doUsefulWorkActivity();
    monitorHealth();
  }

  @Asynchronous(daemon=true)
  void monitorHealth(Promise<?>... waitFor) {
    activitiesClient.monitoringActivity();
  }
}
```

在上述示例中，在 `doUsefulWorkActivity` 完成后，将自动取消 `monitoringHealth`。这反过来将取消基于此异步方法的整个执行分支。取消的语义与 `TryCatchFinally` 中的相同。同样，您可以通过将布尔值标记传递到构造函数来将 `TryCatchFinally` 标记为 daemon。

```
public class MyWorkflowImpl implements MyWorkflow {
    MyActivitiesClient activitiesClient = new MyActivitiesClientImpl();

    @Override
    public void startMyWF(int a, String b) {
        activitiesClient.doUsefulWorkActivity();
        new TryFinally(true) {
            @Override
            protected void doTry() throws Throwable {
                activitiesClient.monitoringActivity();
            }

            @Override
            protected void doFinally() throws Throwable {
                // clean up
            }
        };
    }
}
```

在 `TryCatchFinally` 中启动的守护程序任务的范围限于创建它的上下文，也就是其范围将限定于 `doTry()`、`doCatch()` 或 `doFinally()` 方法。例如，在以下示例中，startMonitoring 异步方法将标记为 daemon 并从 `doTry()` 进行调用。一旦在 `doTry()` 中启动的其他任务 (在此示例中，为 `doUsefulWorkActivity`) 完成，就将取消为它创建的任务。

```
public class MyWorkflowImpl implements MyWorkflow {
    MyActivitiesClient activitiesClient = new MyActivitiesClientImpl();

    @Override
    public void startMyWF(int a, String b) {
        new TryFinally() {
            @Override
            protected void doTry() throws Throwable {
                activitiesClient.doUsefulWorkActivity();
                startMonitoring();
            }

            @Override
            protected void doFinally() throws Throwable {
                // Clean up
            }
        };
    }

    @Asynchronous(daemon = true)
    void startMonitoring(){
      activitiesClient.monitoringActivity();
    }
```