gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:32 24 4
gpt4 key购买 nike

我有两个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com