in src/main/java/com/amazon/sqs/javamessaging/AmazonSQSExtendedClient.java [307:362]
public ReceiveMessageResponse receiveMessage(ReceiveMessageRequest receiveMessageRequest) {
//TODO: Clone request since it's modified in this method and will cause issues if the client reuses request object.
if (receiveMessageRequest == null) {
String errorMessage = "receiveMessageRequest cannot be null.";
LOG.error(errorMessage);
throw SdkClientException.create(errorMessage);
}
ReceiveMessageRequest.Builder receiveMessageRequestBuilder = receiveMessageRequest.toBuilder();
appendUserAgent(receiveMessageRequestBuilder);
if (!clientConfiguration.isPayloadSupportEnabled()) {
return super.receiveMessage(receiveMessageRequestBuilder.build());
}
//Remove before adding to avoid any duplicates
List<String> messageAttributeNames = new ArrayList<>(receiveMessageRequest.messageAttributeNames());
messageAttributeNames.removeAll(RESERVED_ATTRIBUTE_NAMES);
messageAttributeNames.addAll(RESERVED_ATTRIBUTE_NAMES);
receiveMessageRequestBuilder.messageAttributeNames(messageAttributeNames);
receiveMessageRequest = receiveMessageRequestBuilder.build();
ReceiveMessageResponse receiveMessageResponse = super.receiveMessage(receiveMessageRequest);
ReceiveMessageResponse.Builder receiveMessageResponseBuilder = receiveMessageResponse.toBuilder();
List<Message> messages = receiveMessageResponse.messages();
List<Message> modifiedMessages = new ArrayList<>(messages.size());
for (Message message : messages) {
Message.Builder messageBuilder = message.toBuilder();
// for each received message check if they are stored in S3.
Optional<String> largePayloadAttributeName = getReservedAttributeNameIfPresent(message.messageAttributes());
if (largePayloadAttributeName.isPresent()) {
String largeMessagePointer = message.body();
largeMessagePointer = largeMessagePointer.replace("com.amazon.sqs.javamessaging.MessageS3Pointer", "software.amazon.payloadoffloading.PayloadS3Pointer");
messageBuilder.body(payloadStore.getOriginalPayload(largeMessagePointer));
// remove the additional attribute before returning the message
// to user.
Map<String, MessageAttributeValue> messageAttributes = new HashMap<>(message.messageAttributes());
messageAttributes.keySet().removeAll(RESERVED_ATTRIBUTE_NAMES);
messageBuilder.messageAttributes(messageAttributes);
// Embed s3 object pointer in the receipt handle.
String modifiedReceiptHandle = embedS3PointerInReceiptHandle(
message.receiptHandle(),
largeMessagePointer);
messageBuilder.receiptHandle(modifiedReceiptHandle);
}
modifiedMessages.add(messageBuilder.build());
}
receiveMessageResponseBuilder.messages(modifiedMessages);
return receiveMessageResponseBuilder.build();
}