@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客户端等待最新消息/特定文件的消息?
答案 0 :(得分:0)
标准SQS队列没有保证的交货顺序。因此,如果您要求一条消息(一条或多条消息),则可能会收到旧消息或新消息(但它们通常是有序的)。这应该很好,因为基于队列的系统不应依赖消息的顺序。 (但是,SQS FIFO队列可以保证顺序。)
从声音上看,如果您收到的是基于“旧文件”的消息,则说明您没有正确处理以前检索到的消息。当您的流程从SQS检索消息时,它应该执行必要的工作,然后调用DeleteMessage()
以从队列中删除该消息。
您的用例实际上听起来像是使用 AWS Lambda函数的理想情况。将新对象添加到S3存储桶后,可以将其配置为触发Lambda函数(而不是发送SQS消息)。然后,Lambda函数可以处理文件。与让您的代码不断轮询SQS队列相比,这是一个更简单的解决方案。