最佳答案
我正在以一种非常简单的方式使用 Amazon SQS 队列。通常,消息被写入并立即可见和读取。偶尔,会写入一条消息,并在队列中保留 In-Flight (Not Visible)几分钟。我在控制台上就能看到。接收消息-等待时间为0,默认可见性为5秒。它将保持这种状态几分钟,或者直到写入新消息并以某种方式释放它为止。几秒钟的延迟是可以的,但是超过60秒就不行了。
有8个读线程,总是轮询很长,所以不是有什么东西不想读它,而是它们。
编辑 : 需要说明的是,没有任何使用者读操作返回任何消息,无论控制台是否打开,都会发生这种情况。在这个场景中,只涉及到一条消息,而且它就在消费者不可见的队列中。
有人见过这种行为吗? 我可以做些什么来改善它?
下面是我正在使用的 java 的 sdk:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
下面是进行读取的代码(max = 10,maxwait = 0启动配置) :
void read(MessageConsumer consumer) {
List<Message> messages = read(max, maxWait);
for (Message message : messages) {
if (tryConsume(consumer, message)) {
delete(message.getReceiptHandle());
}
}
}
private List<Message> read(int max, int maxWait) {
AmazonSQS sqs = getClient();
ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
rq.setMaxNumberOfMessages(max);
rq.setWaitTimeSeconds(maxWait);
List<Message> messages = sqs.receiveMessage(rq).getMessages();
if (messages.size() > 0) {
LOG.info("read {} messages from SQS queue",messages.size());
}
return messages;
}
“读取”的日志行。."当这种情况发生的时候从来不会出现,这就是导致我进入控制台并查看消息是否存在的原因,它确实存在。