

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

# AWS Flow Framework 基本概念：任务列表和任务执行
<a name="awsflow-basics-task-lists"></a>

 Amazon SWF 通过将工作流和活动任务发布到指定列表来管理它们。Amazon SWF 维护至少两个任务列表，一个用于工作流工作线程，另一个用于活动工作线程。

**注意**  
您可以根据需要指定任意数量的任务列表，将为每个列表分配不同的工作线程。对任务列表的数量没有任何限制。您通常在创建工作线程对象时在工作线程主机应用程序中指定工作线程的任务列表。

以下来自 `HelloWorldWorkflow` 主机应用程序的摘录创建新的活动工作线程并将其分配给 `HelloWorldList` 活动任务列表。

```
public class GreeterWorker  {
    public static void main(String[] args) throws Exception {
    ...
    String domain = " helloWorldExamples";
    String taskListToPoll = "HelloWorldList";

    ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll);
    aw.addActivitiesImplementation(new GreeterActivitiesImpl());
    aw.start();
    ...
  }
}
```

默认情况下，Amazon SWF 在 `HelloWorldList` 列表中安排工作线程的任务。然后工作线程轮询该列表中的任务。您可以向任务列表分配任何名称。您甚至可以对工作流和活动列表使用相同的名称。在内部，Amazon SWF 将工作流和活动任务列表的名称放在不同的命名空间中，因此这两个列表是不同的。

如果您未指定任务列表，则会 AWS Flow Framework 指定工作人员向 Amazon SWF 注册该类型时的默认列表。有关更多信息，请参阅 [工作流程和活动类型注册](features.registration.md)。

有时让一个特定工作线程或一组工作线程执行某些任务非常有用。例如，图像处理工作流可能使用一个活动来下载图像并使用另一个活动来处理该图像。在同一个系统上执行这两个任务会更高效，并可避免通过网络传输大型文件的开销。

要支持此类情况，您可以在调用活动客户端方法时使用包括 `schedulingOptions` 参数的重载显式指定任务列表。您可以通过向方法传递一个经过适当配置的`ActivitySchedulingOptions`对象来指定任务列表。

例如，假设 `HelloWorldWorkflow` 应用程序的 `say` 活动由不同于 `getName` 和 `getGreeting` 的活动工作线程托管。以下示例演示如何确保 `say` 使用与 `getName` 和 `getGreeting` 相同的任务列表，即使它们最初分配到了不同的列表。

```
public class GreeterWorkflowImpl implements GreeterWorkflow {
  private GreeterActivitiesClient operations1 = new GreeterActivitiesClientImpl1(); //getGreeting and getName
  private GreeterActivitiesClient operations2 = new GreeterActivitiesClientImpl2(); //say
  @Override
  public void greet() {
    Promise<String> name = operations1.getName();
    Promise<String> greeting = operations1.getGreeting(name);
    runSay(greeting);
  }
  @Asynchronous
  private void runSay(Promise<String> greeting){
    String taskList = operations1.getSchedulingOptions().getTaskList();
    ActivitySchedulingOptions schedulingOptions = new ActivitySchedulingOptions();
    schedulingOptions.setTaskList(taskList);
    operations2.say(greeting, schedulingOptions);
  }
}
```

异步 `runSay` 方法从其客户端对象获取 `getGreeting` 任务列表。然后它创建并配置 `ActivitySchedulingOptions` 对象，该对象确保 `say` 轮询与 `getGreeting` 相同的任务列表。

**注意**  
当您将 `schedulingOptions` 参数传递给活动客户端方法时，它会仅针对该活动执行覆盖原始任务列表。如果您在未指定任务列表的情况下再次调用活动客户端方法，Amazon SWF 会将任务分配给原始列表，且活动工作线程将轮询该列表。