【问题标题】:Java How to attach a file to AWS SQS Message?Java 如何将文件附加到 AWS SQS 消息?
【发布时间】:2020-11-08 07:21:28
【问题描述】:

我是 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) 的集合来定义名称、数据类型和“SdkBytes”
3 将此集合提供给构建器

在我看来这是一个过程:
SourceObject -> 一些 InputStreamer -> "SdkBytes" 对象 -> MessageAttributes 对象 -> AttributesMap -> Message.builder().attributes()

谁能指出我更清洁/更好的解决方案?我希望应该存在如下所示的内容:
Message.Builder().MessageBody(JsonObject j).build();
Message.Builder().MessageBody(File f).build();

【问题讨论】:

    标签: java amazon-web-services message-queue amazon-sqs


    【解决方案1】:

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

    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 转换为字符串,但这确实没那么糟糕。

    【讨论】:

    • 我有一个消费者需要消息,但不是 AWS 队列。因此,我正在尝试在不使用 SendMessageRequest 的情况下构建消息
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2013-01-01
    • 2017-05-07
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多