首页 > 解决方案 > 合并新创建的 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 客户端等待最新消息/特定文件的消息?

标签: javaamazon-web-servicesasynchronousamazon-sqs

解决方案


标准 SQS 队列没有保证的传递顺序。因此,如果您要求一条消息(或多条消息),您可能会得到旧消息或新消息(但它们通常是有序的)。这应该没问题,因为基于队列的系统不应该依赖消息的顺序。(但是,SQS FIFO 队列确实保证了顺序。)

从它的声音来看,如果您收到基于“旧文件”的消息,那么您没有正确处理先前检索到的消息。当您的进程从 SQS 检索消息时,它应该完成必要的工作,然后调用DeleteMessage()其从队列中删除。

您的用例实际上听起来像是使用AWS Lambda 函数的完美场景。将新对象添加到 S3 存储桶时,您可以将其配置为触发 Lambda 函数(而不是发送 SQS 消息)。然后 Lambda 函数可以处理该文件。这是一个比让您的代码不断轮询 SQS 队列更简单的解决方案。


推荐阅读