首页 > 解决方案 > Java 如何将文件附加到 AWS SQS 消息?

问题描述

我是 AWS 的新手。我正在尝试将对象附加到 AWS SQS 消息(software.amazon.awssdk.services.sqs.model.Message)

有关此事的 AWS 文档已过时(https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-java-send-message-with-attributes.html
(未按以前版本的编写方式编译. 它很容易修复为可编译,但不是很有用)

有很多方法可以附加字符串,但附加对象的唯一方法似乎是
1 将 SourceObject 放入“SdkBytes”
2 制作三元组集合 (Map<String,MessagAttributes>) 来定义名称、数据类型、和 "SdkBytes"
3 将此集合提供给构建器

在我看来这是一个过程:
SourceObject -> some InputStreamer -> "SdkBytes" object -> MessageAttributes Object -> AttributesMap <String,MessageAttributes> -> Message.builder().attributes()

谁能指出我更清洁/更好的解决方案?我希望应该存在一些看起来像:
Message.Builder().MessageBody(JsonObject j).build();
或者Message.Builder().MessageBody(File f).build();

标签: javaamazon-web-servicesmessage-queueamazon-sqs

解决方案


我不确定我是否在关注问题所在。如果我想发送一个文件,我可以这样做:

FileInputStream fileInputStream = new FileInputStream(fileName);
SendMessageRequest sendMessageRequest = SendMessageRequest.builder()
            .queueUrl(queueUrl)
            .messageBody(Base64.getEncoder().encodeToString(fileInputStream.readAllBytes()))
            .build();
sqsClient.sendMessage(sendMessageRequest);

根据文档,我必须使用 Base64 作为 SQS 消息:

消息只能包含 XML、JSON 和无格式文本

如果您确定您的文件只是文本,则不需要 Base64 编码。意识到消息体的最大大小为 256KB,Base64 编码将使文件大小增加大约 1/3。

对于 ASCII 文件,您可以执行以下操作:

SendMessageRequest sendMessageRequest = SendMessageRequest.builder()
            .queueUrl(queueUrl)
            .messageBody(Files.readString(Paths.get(fileName), StandardCharsets.US_ASCII))
            .build();
sqsClient.sendMessage(sendMessageRequest)

如果你想发送一个 JsonObject(我的意思是 Java EE 中的javax.json.JsonObject,因为这是一个高度重载的 Java 类名),你可以这样做:

JsonObject jsonObject = Json.createObjectBuilder()
        .add("message", "hello")
        .build();
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = Json.createWriter(stringWriter);
jsonWriter.write(jsonObject);

SendMessageRequest sendMessageRequest = SendMessageRequest.builder()
        .queueUrl(queueUrl)
        .messageBody(stringWriter.toString())
        .build();
sqsClient.sendMessage(sendMessageRequest);

这个不需要Base64,因为它应该是常规的Json。

当然,您必须将文件或 Json 转换为字符串,但这确实还不错。


推荐阅读