Amazon Java SQS 客户端:如何有选择地从队列中删除消息?
Amazon Java SQS Client: How can I selectively delete a message from the queue?
我有一个 Spring 引导 class 从(当前)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
}
}
}
我希望能够“跳过”消息并找到只有特定的消息从该队列中删除。我的领导确信这是可以做到的,但我有疑问。这些是我的想法:
- 如果我更改为标准队列,可以这样做吗?
- 我看到你必须 收到 一条消息才能获得
DeleteMessageRequest
的 receiptHandle
。
- 但是如果我收到一条我想处理的消息,而不是要删除的消息,我该怎么办
回到队列中?
- 我是否扩展
visibilityTimeout
以便稍后接收消息?
- 是的,完全按照您的描述:接收消息,提取回执句柄,提交删除消息请求
- 是
- 只需不执行任何操作,消息将在其可见性超时到期后自动弹出回到队列中。请注意,即使是这样的基本接收也会增加接收计数器,并可能根据您的配置将消息推送到 dlq
- 不,延长可见性超时只会进一步延迟进一步处理
我有一个 Spring 引导 class 从(当前)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
}
}
}
我希望能够“跳过”消息并找到只有特定的消息从该队列中删除。我的领导确信这是可以做到的,但我有疑问。这些是我的想法:
- 如果我更改为标准队列,可以这样做吗?
- 我看到你必须 收到 一条消息才能获得
DeleteMessageRequest
的receiptHandle
。 - 但是如果我收到一条我想处理的消息,而不是要删除的消息,我该怎么办 回到队列中?
- 我是否扩展
visibilityTimeout
以便稍后接收消息?
- 是的,完全按照您的描述:接收消息,提取回执句柄,提交删除消息请求
- 是
- 只需不执行任何操作,消息将在其可见性超时到期后自动弹出回到队列中。请注意,即使是这样的基本接收也会增加接收计数器,并可能根据您的配置将消息推送到 dlq
- 不,延长可见性超时只会进一步延迟进一步处理