amazon-web-services - Amazon Java SQS 客户端:如何有选择地从队列中删除消息?
问题描述
我有一个 Spring Boot 类,它从(当前)FIFO SQS 队列接收消息,如下所示:
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest()
.withQueueUrl(queueUrl)
.withMaxNumberOfMessages(numMessages);
Map<String, String> messageMap = new HashMap<>();
try {
List<Message> messages = sqsClient.receiveMessage(receiveMessageRequest).getMessages();
if (!messages.isEmpty()) {
if (messages.size() == 1) {
Message message = messages.get(0);
String messageBody = message.getBody();
String receiptHandle = message.getReceiptHandle();
// snipped
}
}
}
我希望能够“跳过”消息并仅找到要从该队列中删除的特定消息。我的领导确信这是可以做到的,但我有疑问。这些是我的想法:
- 如果我更改为标准队列,可以这样做吗?
- 我看到您必须收到一条消息才能
receiptHandle
获取DeleteMessageRequest
. - 但是如果我收到一条我想要处理的消息,而不是要删除的消息,我该如何将它放回队列中?
- 我是否可以扩展
visibilityTimeout
以让稍后接收消息?
解决方案
- 是的,正如您描述的那样:接收消息,提取回执句柄,提交删除消息请求
- 是的
- 通过简单地不做任何事情,消息将在其可见性超时到期后自动弹回队列中。请注意,即使是这样的基本接收也会增加接收计数器,并且可能会根据您的配置将消息推送到 dlq
- 不,延长可见性超时只会进一步延迟进一步处理
推荐阅读
- arrays - 如何将其他元素添加到数组[大小](已设置索引 0)
- javascript - /update_item/ 处的 JSONDecodeError 预期值:第 1 行第 1 列(字符 0)
- excel - 在 Excel 中编辑文本:在单元格中的每个单词前粘贴“-”
- matplotlib - 如何更改 matplotlib pcolor colobar 刻度字体大小?
- r - 当我已经知道所有系数时,如何求解 R 中的线性方程?
- database - 使用 DB Browser for SQLite 的转储命令问题
- sql - 用于更新具有相同 ID 的实体的 SQL 代码
- laravel - 在 Laravel 8 中发送没有环境变量的电子邮件
- docker - 未创建 Docker LLB 定义 - 未找到目标阶段开发
- wordpress - 如何从 QR 码 URL 触发电子邮件?