java - 合并新创建的 aws sqs 消息
问题描述
@Async
public void scanFile() {
log.info("Start scanning");
String queueUrl = sqs.getQueueUrl("bucket-antivirus").getQueueUrl();
List<Message> messages = sqs.receiveMessage(new ReceiveMessageRequest()
.withQueueUrl(queueUrl)
.withWaitTimeSeconds(20))
.getMessages();
for (Message message : messages) {
try {
// move clear file to file bucket
}
...
log.info("Scanning complete");
}
}
当用户上传文件时,SQS 会收到一条消息。应用程序会将文件移动到新存储桶。
但即使我添加了 SQS 客户端的等待时间,我也无法获得最新消息。通过多次测试,我上传一个文件后,我只得到之前文件的消息。如何让 SQS 客户端等待最新消息/特定文件的消息?
解决方案
标准 SQS 队列没有保证的传递顺序。因此,如果您要求一条消息(或多条消息),您可能会得到旧消息或新消息(但它们通常是有序的)。这应该没问题,因为基于队列的系统不应该依赖消息的顺序。(但是,SQS FIFO 队列确实保证了顺序。)
从它的声音来看,如果您收到基于“旧文件”的消息,那么您没有正确处理先前检索到的消息。当您的进程从 SQS 检索消息时,它应该完成必要的工作,然后调用DeleteMessage()
将其从队列中删除。
您的用例实际上听起来像是使用AWS Lambda 函数的完美场景。将新对象添加到 S3 存储桶时,您可以将其配置为触发 Lambda 函数(而不是发送 SQS 消息)。然后 Lambda 函数可以处理该文件。这是一个比让您的代码不断轮询 SQS 队列更简单的解决方案。
推荐阅读
- linux - 如何查找和连接具有不同字符但其根在文本文件中列出的文件?
- python - nltk:如何搜索一些单词之间的联系?
- android - Android facebook登录不会进入下一个活动
- c# - Bot Framework v4.2 - 从 OnTurnError 异常中顺利恢复
- python - 回调分配 GPU 内存
- html - 保持 CSS 网格中列之间的比例。如何计算网格列?
- oracle-apex - 使用动态动作来隐藏/显示基于具有可变条件的另一个 LOV 的 LOV
- c# - 如何使用c#从xml中删除元素id
- sql - 如何在 SQL 中为时间序列创建移动窗口计算?(不是平均值)
- python - 无法根据熊猫数据框中的条件为值添加前缀