Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用AmazonSQSExtendedClient从SQSEvent接收数据_Java_Amazon Web Services_Aws Lambda_Aws Sdk - Fatal编程技术网

Java 如何使用AmazonSQSExtendedClient从SQSEvent接收数据

Java 如何使用AmazonSQSExtendedClient从SQSEvent接收数据,java,amazon-web-services,aws-lambda,aws-sdk,Java,Amazon Web Services,Aws Lambda,Aws Sdk,我有两个AWS lambda函数通过SQS队列连接在一起。他们已经正常工作了一段时间,但是最近有效负载的大小增加了,现在它突破了256Kb的限制 阅读后,我喜欢使用AmazonSQSExtendedClient。我已经查看了上的代码,并使我的第一个lambda函数正确地发送消息(较小的有效负载通过SQS,较大的有效负载写入S3) 我正在努力接收消息:我的第二个lambda的入口点如下所示: public class SqsHandler implements RequestHandler<

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

阅读后,我喜欢使用AmazonSQSExtendedClient。我已经查看了上的代码,并使我的第一个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());
  }
}
public类SqsHandler实现RequestHandler{
公共无效HandlerRequest(SQSEvent事件、上下文){
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应该怎么写。屏幕上的示例代码显示:

final ReceiveMessageRequest ReceiveMessageRequest=
新的ReceiveMessageRequest(myQueueUrl);
列表消息=sqsExtended
.receiveMessage(receiveMessageRequest).getMessages();

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

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

谢谢。如果我理解正确,那么我需要做的就是编写代码来读取主体,确定负载是否存储在S3上并读取它。我猜这不是火箭科学,但我希望这是AmazonSQSExtendedClient API的一部分。
final ReceiveMessageRequest receiveMessageRequest =
        new ReceiveMessageRequest(myQueueUrl);
List<Message> messages = sqsExtended
        .receiveMessage(receiveMessageRequest).getMessages();