如何从 SQS 消息中获取“Ap​​proximateReceiveCount”

Jak*_*kub 5 java amazon-sqs amazon-web-services

我正在使用亚马逊 SQS。我的目标是使用 Java SDK(v2.10.4,Java 11)从API 操作读取ApproximateReceiveCount属性。ReceiveMessage

我尝试了以下代码,但message.attributes()不包含所需的密钥:

String getApproximateReceiveCount() {
    var receiveMessageRequest = ReceiveMessageRequest.builder()
        .queueUrl("https://sqs.eu-west-1.amazonaws.com/012345678910/my-example-queue")
        .build();
    var sqsClient = SqsClient.builder().endpointOverride(URI.create("http://localhost:4576")).build();
    var response = sqsClient.receiveMessage(receiveMessageRequest);
    var message = response.messages().get(0);
    return message.attributes().get(MessageSystemAttributeName.APPROXIMATE_RECEIVE_COUNT);
}
Run Code Online (Sandbox Code Playgroud)

在此地图中如何接收密钥条目MessageSystemAttributeName.APPROXIMATE_RECEIVE_COUNT

Jak*_*kub 8

根据您链接到的文档页面ReceiveMessage,有一个名为AttributeName.N描述为的参数

\n\n
\n

需要与每条消息一起返回的属性列表。这些属性包括:

\n\n
    \n
  • [...]
  • \n
  • ApproximateReceiveCount \xe2\x80\x93 返回已从队列接收但未删除消息的次数。
  • \n
\n
\n\n

因此,您需要在请求中请求该属性,以便它在响应中可用。为此,请使用ReceiveMessageRequestBuilder.attributeNamesWithStrings()如下方法:

\n\n
String getApproximateReceiveCount() {\n    var receiveMessageRequest = ReceiveMessageRequest.builder()\n        .queueUrl("https://sqs.eu-west-1.amazonaws.com/012345678910/my-example-queue")\n        .attributeNamesWithStrings(MessageSystemAttributeName.APPROXIMATE_RECEIVE_COUNT.toString())\n        .build();\n    var sqsClient = SqsClient.builder().endpointOverride(URI.create("http://localhost:4576")).build();\n    var response = sqsClient.receiveMessage(receiveMessageRequest);\n    var message = response.messages().get(0);\n    return message.attributes().get(MessageSystemAttributeName.APPROXIMATE_RECEIVE_COUNT);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,有两个名称相似的方法,您不能使用它们:

\n\n
    \n
  • .attributeNames()- 参数枚举未列出所需的键,
  • \n
  • .messageAttributeNames()- 对应于与消息正文一起发送的属性。
  • \n
\n