gpt4 book ai didi

java - SQS 消息始终保持飞行状态

转载 作者:搜寻专家 更新时间:2023-11-01 02:27:34 25 4
gpt4 key购买 nike

我有以下代码从 SQS 队列中检索消息。我正在使用 AmazonSQSBufferedAsyncClient 从队列中检索消息。固定延迟 SingleThreadedExecutor 每 5 分钟唤醒一次调用 receiveMessage。 Queue中启用了长轮询

@Service
public class AmazonQueueService
implements QueueService<String> {

@Autowired
private AmazonSQSBufferedAsyncClient sqsAsyncClient;

@Value("${aws.sqs.queueUrl}")
private String queueUrl;

@Override
public List<Message<String>> receiveMessage() {
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
ReceiveMessageResult result = sqsAsyncClient.receiveMessage(receiveMessageRequest);

LOG.debug("Size=" + result.getMessages().size());

return Lists.transform(result.getMessages(), ......);
}

.....
}

问题是当我检查 AWS 控制台时,消息始终在传输中,但应用程序中从未收到它(大小始终打印为 0)。看起来 AmazonSQSBufferedAsyncClient 正在从队列中读取消息,但未在 receiveMessage 调用中返回。

有什么想法吗?

最佳答案

终于明白了。该问题通过队列可见性超时(2 分钟)和 scheduledExecutor 延迟(5 分钟)的组合来体现。

将可见性超时增加到 15 分钟解决了问题。

我的理论是 -> AmazonSQSBufferedAsyncClient 检索消息并将其保存在缓冲区中等待 receiveMessage 调用。由于执行程序延迟为 5 分钟,因此在调用 receiveMessage 并将消息返回到队列之前消息的可见性超时。看起来消息几乎是立即从队列中挑选出来的。现在无论出于何种原因,对 receiveMessage 的调用都没有收到消息。我猜想,增加超时让 receiveMessage 调用有机会在超时事件之前发生,从而解决了问题。

还有其他可能的解释吗?

关于java - SQS 消息始终保持飞行状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com