Java 汇集新创建的aws sqs消息 @Async 公共void扫描文件(){ 日志信息(“开始扫描”); 字符串queueUrl=sqs.getQueueUrl(“bucket antivirus”).getQueueUrl(); List messages=sqs.receiveMessage(新的ReceiveMessageRequest() .withQueueUrl(queueUrl) .withWaitTimeSeconds(20)) .getMessages(); 用于(消息:消息){ 试一试{ //将清除文件移动到文件存储桶 } ... 日志信息(“扫描完成”); } }
当用户上传文件时,SQS将收到一条消息。应用程序将文件移动到新的存储桶中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 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");
}
}