有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    听上去,如果您收到的是基于“旧文件”的消息,那么您没有正确处理之前检索到的消息。当您的进程从SQS检索消息时,它应该做必要的工作,然后调用DeleteMessage()将其从队列中删除

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