Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 汇集新创建的aws sqs消息 @Async 公共void扫描文件(){ 日志信息(“开始扫描”); 字符串queueUrl=sqs.getQueueUrl(“bucket antivirus”).getQueueUrl(); List messages=sqs.receiveMessage(新的ReceiveMessageRequest() .withQueueUrl(queueUrl) .withWaitTimeSeconds(20)) .getMessages(); 用于(消息:消息){ 试一试{ //将清除文件移动到文件存储桶 } ... 日志信息(“扫描完成”); } }_Java_Amazon Web Services_Asynchronous_Amazon Sqs - Fatal编程技术网

Java 汇集新创建的aws sqs消息 @Async 公共void扫描文件(){ 日志信息(“开始扫描”); 字符串queueUrl=sqs.getQueueUrl(“bucket antivirus”).getQueueUrl(); List messages=sqs.receiveMessage(新的ReceiveMessageRequest() .withQueueUrl(queueUrl) .withWaitTimeSeconds(20)) .getMessages(); 用于(消息:消息){ 试一试{ //将清除文件移动到文件存储桶 } ... 日志信息(“扫描完成”); } }

Java 汇集新创建的aws sqs消息 @Async 公共void扫描文件(){ 日志信息(“开始扫描”); 字符串queueUrl=sqs.getQueueUrl(“bucket antivirus”).getQueueUrl(); List messages=sqs.receiveMessage(新的ReceiveMessageRequest() .withQueueUrl(queueUrl) .withWaitTimeSeconds(20)) .getMessages(); 用于(消息:消息){ 试一试{ //将清除文件移动到文件存储桶 } ... 日志信息(“扫描完成”); } },java,amazon-web-services,asynchronous,amazon-sqs,Java,Amazon Web Services,Asynchronous,Amazon Sqs,当用户上传文件时,SQS将收到一条消息。应用程序将文件移动到新的存储桶中 但是,即使我为SQS客户端添加了等待时间,我也无法获得最新消息。通过多次测试,在我上传一个文件后,我只得到之前文件的消息。如何让SQS客户端等待最新消息/特定文件的消息?标准SQS队列没有保证的交付顺序。因此,如果你要求一条或多条消息,你可能会收到旧消息或新消息(但它们通常是有序的)。这应该很好,因为基于队列的系统不应该依赖于消息的顺序。(但是,SQS FIFO队列可以保证订单。) 听上去,如果您正在接收基于“旧文件”的消

当用户上传文件时,SQS将收到一条消息。应用程序将文件移动到新的存储桶中


但是,即使我为SQS客户端添加了等待时间,我也无法获得最新消息。通过多次测试,在我上传一个文件后,我只得到之前文件的消息。如何让SQS客户端等待最新消息/特定文件的消息?

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

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


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

消息顺序不是问题。当队列中没有消息时,
sqsclient.getMessages()
不会等待消息飞行,它会立即返回一个空列表,即使我设置了
withWaitTime
.waitasec-所以即使
withWaitTimeSeconds(20)
,它也会立即返回(即:不到一秒),而没有消息?听起来不对。根据文档和我多年使用SQS的经验,
withWaitTimeSeconds
应该等到等待时间到期或有消息可用。听起来这里好像发生了什么事…@Krease这是由
@Async
引起的吗?因为我可以在添加
Thread.sleep(5000)
等待5秒后获得消息,然后再
getMessages()
。可能是-您也异步发布消息了吗?在相关说明中-“当用户上载文件时,SQS将收到消息。应用程序将把文件移动到新的存储桶。”--你为什么要通过SQS来完成这项工作?Cloudwatch事件或Lambda可能更适合此特定过程
@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");
        }
}