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客户端等待最新消息/特定文件的消息
# 1 楼答案
标准SQS队列没有保证的交货顺序。因此,如果你要求一条或多条信息,你可能会收到旧的或新的(但它们通常是有序的)。这应该没问题,因为基于队列的系统不应该依赖于消息的顺序。(然而,SQS FIFO队列可以保证订单。)
听上去,如果您收到的是基于“旧文件”的消息,那么您没有正确处理之前检索到的消息。当您的进程从SQS检索消息时,它应该做必要的工作,然后调用
DeleteMessage()
将其从队列中删除您的用例实际上听起来像是使用AWS Lambda函数的理想情况。当一个新对象被添加到S3 bucket中时,您可以将其配置为触发Lambda函数(而不是发送SQS消息)。然后Lambda函数可以处理该文件。这是一个比让代码不断轮询SQS队列更简单的解决方案