java - 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();
解决方案
我不确定我是否在关注问题所在。如果我想发送一个文件,我可以这样做:
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 转换为字符串,但这确实还不错。
推荐阅读
- python - ModuleNotFoundError: No module named 'pandas' - 当我已经安装了 pandas
- elasticsearch - 弹性搜索与 lucene
- .net - 实现递归接口的类/结构
- file-io - fopen 在 Windows 上调用 CreateFile 吗?
- reactjs - 反应状态返回不同步数据
- r - R Studio:方差分析因子和 Tukey 事后问题
- reactjs - 从 create-react-app 更新到新版本的步骤?
- java - 为什么使用 lambdas 进行日志记录更好的事实
- python - Sklearn - 从逻辑回归中返回前 3 类
- java - IntelliJ 运行使用 @Ignore 注释的 Kotlin 测试