活动实现 - AWS Flow Framework 适用于 Java

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

活动实现

通过提供 @Activities 接口的实现来实现活动。适用于 Java 的 AWS Flow Framework 使用在工作线程上配置的活动实现实例在运行时处理活动任务。工作线程会自动查找适当类型的活动实现。

您可以使用属性和字段来将资源传递给活动实例,如数据库连接。由于可能从多个线程访问活动实现对象,共享资源必须是线程安全的。

请注意,活动实现不使用 Promise<> 类型的参数或返回该类型的对象。这是因为活动的实现不应依赖它的调用方式 (同步或异步)。

之前显示的活动接口可按如下方式实现:

public class MyActivitiesImpl implements MyActivities { @Override @ManualActivityCompletion public int activity1(){ //implementation } @Override public void activity2(int foo){ //implementation } }

可以向活动实现提供线程本地上下文,这可用于检索任务对象、所使用的数据转换器对象等。可通过 ActivityExecutionContextProvider.getActivityExecutionContext() 访问当前上下文。有关详细信息,请参阅 ActivityExecutionContext 的AWS SDK for Java文档和执行关联一节。

手动完成活动

以上示例中的 @ManualActivityCompletion 注释是可选注释。仅在实现活动的方法上允许它,用于将活动配置为不在活动方法返回时自动完成。如果您想异步完成活动,例如,在人工操作完成后手动完成活动,这会非常有用。

默认情况下,当您的活动方法返回时,框架认为活动已完成。这意味着活动工作线程会向 Amazon SWF 报告活动任务已完成,并向其提供结果(如果有)。但是,在一些使用案例中,您不希望在活动方法返回时将活动任务标记为已完成。在为人工任务建模时,这尤其有用。例如,活动方法可能将电子邮件发送给某人,该人必须完成某些工作,活动任务才能完成。在这种情况下,您可以使用 @ManualActivityCompletion 注释来注释此活动方法以告诉活动工作线程它不应自动完成活动。要手动完成活动,您可以使用框架中提供的 ManualActivityCompletionClient 或使用 Amazon SWF SDK 中提供的 Amazon SWF Java 客户端上的 RespondActivityTaskCompleted 方法。有关详细信息,请参阅AWS SDK for Java文档。

要完成活动任务,您需要提供任务令牌。Amazon SWF 会使用任务令牌来唯一标识任务。您可以从活动实现中的 ActivityExecutionContext 访问此令牌。您必须将此令牌传递给负责完成任务的一方。可以通过调用 ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken() 来从 ActivityExecutionContext 检索此令牌。

Hello World 示例的 getName 活动可实现为发送电子邮件来要求某人提供问候语:

@ManualActivityCompletion @Override public String getName() throws InterruptedException { ActivityExecutionContext executionContext = contextProvider.getActivityExecutionContext(); String taskToken = executionContext.getTaskToken(); sendEmail("abc@xyz.com", "Please provide a name for the greeting message and close task with token: " + taskToken); return "This will not be returned to the caller"; }

以下代码段可用于提供问候并通过使用 ManualActivityCompletionClient 来关闭任务。或者,您也可以使任务失败:

public class CompleteActivityTask { public void completeGetNameActivity(String taskToken) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); String result = "Hello World!"; manualCompletionClient.complete(result); } public void failGetNameActivity(String taskToken, Throwable failure) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); manualCompletionClient.fail(failure); } }