sdo*_*lgy 26 java amazon-sqs amazon-web-services
我在SQS中有多条消息.以下代码始终只返回一个,即使有几十个可见(不在飞行中). setMaxNumberOfMessages我认为会允许多次一次消费..我误解了吗?
CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName);
String queueUrl = sqs.createQueue(createQueueRequest).getQueueUrl();
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
receiveMessageRequest.setMaxNumberOfMessages(10);
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
for (Message message : messages) {
// i'm a message from SQS
}
Run Code Online (Sandbox Code Playgroud)
我也试过使用withMaxNumberOfMessages而没有任何运气:
receiveMessageRequest.withMaxNumberOfMessages(10);
Run Code Online (Sandbox Code Playgroud)
我怎么知道队列中有消息?超过1?
Set<String> attrs = new HashSet<String>();
attrs.add("ApproximateNumberOfMessages");
CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName);
GetQueueAttributesRequest a = new GetQueueAttributesRequest().withQueueUrl(sqs.createQueue(createQueueRequest).getQueueUrl()).withAttributeNames(attrs);
Map<String,String> result = sqs.getQueueAttributes(a).getAttributes();
int num = Integer.parseInt(result.get("ApproximateNumberOfMessages"));
Run Code Online (Sandbox Code Playgroud)
以上总是先行,并给我一个int> 1
感谢您的输入
sdo*_*lgy 32
AWS API参考指南:Query/QueryReceiveMessage
由于队列的分布式特性,在ReceiveMessage调用上对加权随机机器集进行采样.这意味着只返回采样机器上的消息.如果队列中的消息数量很少(小于1000),则可能会获得比每次ReceiveMessage调用请求的消息少的消息.如果队列中的消息数量非常小,您可能不会在特定的ReceiveMessage响应中收到任何消息; 在这种情况下,您应该重复该请求.
和
MaxNumberOfMessages:要返回的最大消息数.SQS永远不会返回比此值更多的消息,但可能会返回更少的消息.
在SQS参考文档中对此(可以说是相当特殊的)行为有一个全面的解释.
SQS在多个服务器上存储消息副本,并使用两种可能策略之一接收对这些服务器的消息请求,
在实践中,对于我的有限测试,我似乎总是像你一样得到一条短轮询的消息.
我有同样的问题。您的队列的接收消息等待时间是多少?当我的为 0 时,即使队列中有 8 条消息,它也只返回 1 条消息。当我增加接收消息等待时间时,我得到了所有这些。对我来说似乎有点马车。
小智 5
我只是在尝试相同的方法,在这两个属性 setMaxNumberOfMessages 和 setWaitTimeSeconds 的帮助下,我能够获得 10 条消息。
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
receiveMessageRequest.setMaxNumberOfMessages(10);
receiveMessageRequest.setWaitTimeSeconds(20);
Run Code Online (Sandbox Code Playgroud)
o/p 快照:
Receiving messages from TestQueue.
Number of messages:10
Message
MessageId: 31a7c669-1f0c-4bf1-b18b-c7fa31f4e82d
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23556 次 |
| 最近记录: |