合并新创建的AWS sqs消息

时间:2018-07-16 15:02:31

标签: java amazon-web-services asynchronous amazon-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 个答案:

答案 0 :(得分:0)

标准SQS队列没有保证的交货顺序。因此,如果您要求一条消息(一条或多条消息),则可能会收到旧消息或新消息(但它们通常是有序的)。这应该很好,因为基于队列的系统不应依赖消息的顺序。 (但是,SQS FIFO队列可以保证顺序。)

从声音上看,如果您收到的是基于“旧文件”的消息,则说明您没有正确处理以前检索到的消息。当您的流程从SQS检索消息时,它应该执行必要的工作,然后调用DeleteMessage()从队列中删除该消息

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