我正在非常简单的方式使用Amazon SQS队列。通常情况下,消息被写入后立即可见且可读取。偶尔会有一条消息被写入,但在队列中停留了几分钟而处于In-Flight(不可见)状态。我可以从控制台看到它。接收消息等待时间为0,且默认可见性为5秒。它会保持这种状态几分钟,或者直到某个新消息被写入并以某种方式释放它。几秒钟的延迟是可以接受的,但60秒以上就不可以。
有8个读线程始终长轮询,因此并不是没有尝试读取它,它们正在尝试。
编辑:明确一点,消费者读取都没有返回任何消息,无论控制台是否打开都会发生。在这种情况下,只涉及一条消息,它只是坐在队列中对消费者不可见。
有其他人遇到过这种情况吗?我该怎么做才能改善它?
这里是我正在使用的Java sdk:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
以下是读取代码(最大值=10,最大等待时间=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;
}
当发生这种情况时,“read ..” 的日志行不会出现,这就是我需要使用控制台查看消息是否存在的原因,而它确实存在。