Amazon Simple Workflow Service
开发人员指南 (API Version 2012-01-25)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

开发 Amazon SWF 中的活动工作程序

活动工作程序会执行一个或多个活动类型。活动工作程序与 Amazon SWF 通信以接收并执行活动任务。您可以有一队多个活动工作程序执行具有同一种活动类型的活动任务。

当决策程序排定活动任务时,Amazon SWF 会将活动任务提供给活动工作程序。当决策程序排定活动任务时,它会提供活动工作程序执行该活动任务所需的数据(此数据是由您来确定的)。Amazon SWF 会在将活动任务发送到活动工作程序之前,将这些数据插到活动任务中。

活动工作程序由您来管理。可以用任何语言编写活动工作程序。工作程序可在任何地点运行,只要它能通过 API 与 Amazon SWF 通信。由于 Amazon SWF 提供执行活动任务所需的所有信息,因此,所有活动工作程序都可以是无状态的。无状态性使您的工作流程可以高度扩展;处理增长的容量需求并简单增加更多活动工作程序。

本章节说明了如何执行活动工作程序。活动工作程序应重复执行下列操作。

  1. 轮询 Amazon SWF 以获取活动任务。

  2. 开始执行任务。

  3. 如果任务长时间运行,请定期向 Amazon SWF 报告检测信号。

  4. 报告任务已完成或失败并将结果返回到 Amazon SWF。

轮询活动任务

为执行活动任务,每个活动工作程序都必须定期调用 PollForActivityTask 操作以轮询 Amazon SWF。

以下示例所示为,活动工作程序 ChargeCreditCardWorker01 轮询任务列表上的任务 ChargeCreditCard-v0.1。如果没有提供活动任务,则在 60 秒后,Amazon SWF 将返回空响应。空响应是一个 Task 结构,在该结构中,taskToken 值为空字符串。

https://swf.us-east-1.amazonaws.com PollForActivityTask { "domain" : "867530901", "taskList" : { "name": "ChargeCreditCard-v0.1" }, "identity" : "ChargeCreditCardWorker01" }

如果活动任务变为可用,则 Amazon SWF 会将其返回给活动工作程序。任务中包含决策程序在其排定活动时指定的数据。

活动工作程序接收活动任务后就已作好执行工作的准备。下一章提供了执行活动任务方面的信息。

执行活动任务

接收活动任务后,活动工作程序就做好了执行任何的准备。

要执行活动任务

  1. 给您的活动工作程序编程以说明任务输入字段中的内容。该字段中包含决策程序在排定任务时指定的数据。

  2. 给活动工作程序编程以开始处理数据并执行您的逻辑。

下一节说明了如何对活动工作程序进行编程以将长时间运行活动的状态更新提供给 Amazon SWF。

报告活动任务检测信号

如果在活动类型中注册了检测信号超时,则活动工作程序必须在超出检测信号超时之前记录检测信号。如果活动任务没有在超时内提供检测信号,则任务会超时,Amazon SWF 关闭该任务并排定新决策任务以将超时情况通知决策程序。然后,决策程序可重新排定活动任务或采取另一个操作。

如果活动工作程序在超时后尝试联系 Amazon SWF(如通过调用 RespondActivityTaskCompleted),Amazon SWF 将会返回 UnknownResource 故障。

本章描述了提供活动检测信号的方法。

要记录活动任务检测信号,给您的活动工作程序编程以调用 RecordActivityTaskHeartbeat 操作。此操作还会提供字符串字段,您可以在该字段中存储自由格式的数据,从而量化以任何方式作用于您的应用程序的过程。

在此示例中,活动工作程序将检测信号报告给 Amazon SWF,并使用详细信息字段来报告该活动任务已完成 40%。要报告检测信号,活动工作程序必须指定活动任务的任务令牌。

https://swf.us-east-1.amazonaws.com RecordActivityTaskHeartbeat { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "details" : "40" }

此操作本身不会在工作流程执行历史中创建时间;但是,如果任务超时,工作流程执行历史中将会包含 ActivityTaskTimedOut 事件,该事件中包含活动工作程序生成的最后一个检测信号的信息。

完成活动任务或活动任务失败

执行完任务后,活动工作程序应报告活动任务完成或失败。

完成活动任务

若要完成活动任务,请给活动工作程序编程,以使其在成功完成活动任务时调用 RespondActivityTaskCompleted 操作,从而指定任务令牌。

在此示例中,活动工作程序指示任务已成功完成。

https://swf.us-east-1.amazonaws.com RespondActivityTaskCompleted { "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "results": "40" }

活动完成时,Amazon SWF 会针对与该活动关联的工作流程执行排定新决策任务。

给活动工作程序编程,以在其即将完成任务后轮询另一个活动任务。此操作会创建一个循环,在该循环中,活动工作程序会继续轮询并完成任务。

如果该活动没有在 StartToCloseTimeout 期间产生响应,或者如果已超出 ScheduleToCloseTimeout,则 Amazon SWF 将该活动任务超时,并排定决策任务。这会使决策程序采取适当操作,如重新排定任务。

例如,如果 Amazon EC2 实例正在执行活动任务且该实例在任务完成前失败,则决策程序会将一个超时事件接收到工作流程执行历史中。如果该活动任务正在使用检测信号,则决策程序会在该任务未在 Amazon EC2 实例失败后成功传输下一个检测信号时接收该事件。否则,决策程序会在活动任务触及整个超时值中的一个前完成失败时最终接收事件。然后,由决策程序决定重新分配任务或采取某些其它操作。

活动任务失败

如果活动工作程序出于某种原因无法执行活动任务,但仍能与 Amazon SWF 通信,则您可以对其进行编程以使该任务失败。

若要对活动工作程序编程以使某个活动任务失败,请对活动工作程序编程以调用指定任务令牌的 RespondActivityTaskFailed 操作。

https://swf.us-east-1.amazonaws.com RespondActivityTaskFailed { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "reason" : "CC-Invalid", "details" : "Credit Card Number Checksum Failed" }

作为开发人员,您要规定存储在原因和详情字段中的值。这些值是自由格式的字符串;您可以使用适用于您的应用程序的任何错误代码约定。Amazon SWF 不处理这些值。但是,Amazon SWF 可在控制台中显示这些值。

活动任务失败时,Amazon SWF 会排定与该活动任务关联的工作流程执行的决策任务,以通知决策程序任务失败。给您的决策程序编程以处理失败的活动,如通过重新排定活动或使工作流程执行失败,这取决于失败的性质。

启动活动工作程序

要启动活动工作程序,将您的逻辑打包成可执行,这样您就可以将其用于您的活动工作程序平台上。例如,您可以将您的活动代码打包成 Java 可执行,这样您就可以将其用于 Linux 和 Windows 服务器上。

启动后,您的工作程序即会开始轮询任务。在决策程序排定活动任务之前,虽然这些轮询超时未轮询到任务,但您的工作程序只会继续轮询。

由于轮询是出站请求,活动工作程序可以在任何有权访问 Amazon SWF 终端节点的网站上运行。

您想要启动多少活动工作程序就可以启动多少。决策程序排定活动任务时,Amazon SWF 会将活动任务自动分配给轮询活动工作程序。