java - 如何使用 AmazonSQSExtendedClient 从 SQSEvent 接收数据

标签 java amazon-web-services aws-lambda aws-sdk

我有两个 AWS lambda 函数通过 SQS 队列连接在一起。它们已经正常工作了一段时间,但最近有效负载的大小增加了,现在已经突破了 256Kb 的限制。

阅读后Question 43738341喜欢使用 AmazonSQSExtendedClient。我查看了github处的代码并使我的第一个 lambda 函数正确发送消息(小有效负载通过 SQS,较大有效负载写入 S3)。

我正在努力解决的是接收消息:我的第二个 lambda 的入口点如下所示:

public class SqsHandler implements RequestHandler<SQSEvent, Void> {

  public Void handleRequest(SQSEvent event, Context context) {
    SQSEvent.SQSMessage record = event.getRecords().get(0);

    System.out.println("0. record " + record.toString());
    System.out.println("1. eventSource " + record.getEventSource());
    System.out.println("2. eventSourceARN " + record.getEventSourceArn());
    System.out.println("3. MessageId"  + record.getMessageId());
    System.out.println("4. ReceiptHandle " + record.getReceiptHandle());
    System.out.println("5. Body " + record.getBody());
  }
}

当我的入口点被调用时,我已经收到了我的 SQS 事件。我不(也不应该?)知道它来自哪个队列。

GitHub 上的代码示例(几乎逐行复制到所有其他站点上)发送者和接收者都是相同的 lambda。因此,它能够创建 ReceiveMessageRequest 对象,因为它知道队列 URL。

在真实的系统中,发送者和接收者永远不会相同。我什至可以通过多个队列接收来自多个 Lambda 的数据

我不明白的是接收 Lambda 应该如何编写。 AWS Website上的示例代码说:

final ReceiveMessageRequest receiveMessageRequest =
        new ReceiveMessageRequest(myQueueUrl);
List<Message> messages = sqsExtended
        .receiveMessage(receiveMessageRequest).getMessages();

但这需要我知道队列的 url。它也不与需要使用的 SQSEvent 相关联。

最佳答案

有效负载超过 256KB 的 SQSEvent 记录的消息正文应包含一个表示 S3 指针的 JSON 字符串,该指针由存储实际有效负载的 s3BucketName 和 s3Key 属性组成。请参阅MessageS3Pointer AmazonSQSExtendedClient 的类定义和 storeMessageInS3 方法类供引用。有了这些信息,您应该能够直接从 S3 获取消息内容,而无需依赖 Lambda 事件处理程序中的 SQS 扩展客户端库。

关于java - 如何使用 AmazonSQSExtendedClient 从 SQSEvent 接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042235/

相关文章:

amazon-web-services - 将对 API 网关的引用传递给 Lambda

java - 如何在JTable中获取图像图标

amazon-web-services - 查找给定资源的 Cloudwatch 日志组

java - 如何以编程方式启动 s3 ninja?

aws-lambda - cloudwatch lambda 日志不显示嵌套对象内容

python-3.x - AWS lambda 无法导入名称 '_bcrypt'

java - 将行添加到现有 Java 表结果

java - Android 上的异步套接字实现

java - 获取 JInternalFrame 出现的问题

ios - AWS S3 存储桶问题