使 Step Functions 等待 SQS 为空的最佳方法

Best way to make Step Functions wait for the SQS to be empty

step function workflow 等待 sqs topic 为空然后继续工作流程的最佳方法是什么。有没有办法检查主题长度,以便我可以在阶跃函数工作流程中做出反应?这真的是解决这个问题的正确方法吗? 或者我会创建一个 lambda 来完全做到这一点并在我的 step function workflow

中触发它

提前致谢:)

您可以构建使用 Lambda 运行时的 Lambda 函数 API。然后在该 Lambda 函数中使用 SQS Java API。查看使用此方法检索队列属性。

https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sqs/SqsClient.html#getQueueAttributes-software.amazon.awssdk.services.sqs.model.GetQueueAttributesRequest-

看下面的属性。

ApproximateNumberOfMessages - Returns 队列中可见消息的大概数量

这是一个使用 SQS Java V2 API 获取消息数量的代码示例。

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class GetQueueAttributes {


    public static void main(String[] args) {
        final String USAGE = "\n" +
                "Usage: AddQueueTags <queueName>\n\n" +
                "Where:\n" +
                "  queueName - the name of the queue to which tags are applied.\n\n";

        if (args.length != 1) {
            System.out.println(USAGE);
            System.exit(1);
        }

        String queueName = args[0];
        SqsClient sqsClient = SqsClient.builder()
                .region(Region.US_WEST_2)
                .build();


        try {
        GetQueueUrlResponse getQueueUrlResponse =
                sqsClient.getQueueUrl(GetQueueUrlRequest.builder().queueName(queueName).build());

        String queueUrl = getQueueUrlResponse.queueUrl();


        // Specify the attributes to retrieve.
        List<QueueAttributeName> atts = new ArrayList();
        atts.add(QueueAttributeName.APPROXIMATE_NUMBER_OF_MESSAGES);

        GetQueueAttributesRequest attributesRequest= GetQueueAttributesRequest.builder()
                .queueUrl(queueUrl)
                .attributeNames(atts)
                .build();

        GetQueueAttributesResponse response = sqsClient.getQueueAttributes(attributesRequest);

        Map<String,String> queueAtts = response.attributesAsStrings();
        for (Map.Entry<String,String> queueAtt : queueAtts.entrySet())
                System.out.println("Key = " + queueAtt.getKey() +
                        ", Value = " + queueAtt.getValue());

    } catch (SqsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}

很棒的是,您可以创建不同的 Lambda 函数,然后使用 Step Functions 将每个 Lambda 函数挂钩为一个工作流步骤。这是构建工作流并让该工作流中的每个步骤使用 AWS Java API 执行特定 AWS 服务操作的好方法。

要了解如何将 Lambda 函数挂接到工作流中,请参阅本教程。

Create AWS serverless workflows by using the AWS SDK for Java