首页 > 其他分享 >Spring boot 要监听 S3 上的文件, 当有新文件到来时,下载新文件(SQS 版)

Spring boot 要监听 S3 上的文件, 当有新文件到来时,下载新文件(SQS 版)

时间:2024-08-14 20:49:01浏览次数:13  
标签:文件 String S3 Spring AWS SQS import

要在Spring Boot中实现对AWS S3上新文件的监听并自动下载的功能,可以通过以下几种方式实现:

1. 使用AWS Lambda和S3 Event Notification

  • 配置S3 Bucket的事件通知,当有新文件上传到S3时,触发AWS Lambda函数。
  • Lambda函数调用Spring Boot应用的API来通知新文件的到来。
  • 这种方法需要配置AWS Lambda和API Gateway,但可以确保快速响应文件上传事件。

2. 使用轮询(Polling)方法

  • 定期轮询S3 Bucket,检查是否有新文件。
  • 如果发现有新文件,则下载该文件。
  • 这种方法简单易实现,但可能存在一定的延迟,因为它依赖于轮询的间隔时间。

3. 使用AWS SQS(Simple Queue Service)与S3事件通知结合

  • 配置S3 Bucket事件通知,当有新文件上传时,向AWS SQS队列发送消息。
  • Spring Boot应用监听该SQS队列,当收到消息时下载文件。
  • 这种方法相对更加实时且无需持续轮询。

以下是使用AWS SQS与S3事件通知结合的实现方法:

步骤一:配置S3 Bucket事件通知

在AWS S3控制台中,为你的Bucket配置事件通知。当文件被上传到Bucket时,通知消息会被发送到指定的SQS队列。

  1. 打开S3控制台,选择你的Bucket。
  2. 转到属性,找到事件通知,点击创建事件通知
  3. 为事件命名,并选择需要监听的事件类型,例如PUT(文件上传)。
  4. 在目标部分选择SQS队列,并选择相应的队列。

步骤二:在Spring Boot中配置SQS监听器

在Spring Boot应用中使用@SqsListener注解监听SQS消息,并处理文件下载。

  1. 添加依赖

    pom.xml中添加AWS SQS和S3的依赖:

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>sqs</artifactId>
        <version>2.17.27</version>
    </dependency>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
        <version>2.17.27</version>
    </dependency>
    
  2. 配置SQS Listener

    创建一个配置类或在现有的服务类中实现SQS监听器。

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener;
    import org.springframework.stereotype.Service;
    import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
    import software.amazon.awssdk.services.s3.S3Client;
    import software.amazon.awssdk.services.s3.model.GetObjectRequest;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    @Service
    public class S3FileListenerService {
    
        private final S3Client s3Client;
        private final String bucketName;
    
        public S3FileListenerService(@Value("${aws.s3.bucketName}") String bucketName,
                                     @Value("${aws.region}") String region) {
            this.s3Client = S3Client.builder()
                    .region(Region.of(region))
                    .credentialsProvider(DefaultCredentialsProvider.create())
                    .build();
            this.bucketName = bucketName;
        }
    
        @SqsListener("your-sqs-queue-name")
        public void processNewS3FileEvent(String message) {
            // 解析S3事件消息,获取新文件的Key
            String keyName = extractKeyNameFromMessage(message);
    
            // 下载新文件
            try {
                downloadFile(keyName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private String extractKeyNameFromMessage(String message) {
            // 实现从SQS消息中提取S3文件Key的逻辑
            // 可以使用JSON解析器解析消息内容
            return "extracted-key-from-message"; // 示例返回值
        }
    
        private void downloadFile(String keyName) throws IOException {
            GetObjectRequest request = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();
    
            File tempFile = File.createTempFile("s3file-", ".tmp");
            try (FileOutputStream fos = new FileOutputStream(tempFile);
                 var s3Object = s3Client.getObject(request)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = s3Object.read(buffer)) != -1) {
                    fos.write(buffer, 0, bytesRead);
                }
            }
    
            System.out.println("Downloaded file: " + tempFile.getAbsolutePath());
        }
    }
    

步骤三:配置AWS凭证和Bucket信息

application.properties中配置AWS S3和SQS相关的信息。

aws.s3.bucketName=your-bucket-name
aws.region=your-region

解释

  • SQS Listener@SqsListener注解用于监听指定的SQS队列。当有消息到达队列时,会触发对应的方法。
  • 消息处理processNewS3FileEvent方法解析SQS消息,并从中提取S3文件的Key。
  • 下载文件:使用downloadFile方法从S3下载新文件并保存到本地。

总结

通过配置S3事件通知和使用SQS监听器,Spring Boot应用可以在S3上有新文件上传时自动响应并下载该文件。这样的方法不仅避免了持续轮询带来的资源浪费,还能确保新文件能及时处理。

标签:文件,String,S3,Spring,AWS,SQS,import
From: https://www.cnblogs.com/gongchengship/p/18359757

相关文章

  • PowerShell快速修改多个文件的名称
      本文介绍基于PowerShell语言,对文件夹中全部文件的名称加以批量替换、修改的方法。  在之前的文章中,我们介绍了基于Python语言,批量修改大量文件的名称的方法。当时我们修改文件名的需求比较复杂,因此选择了用Python语言来实现;而在我们的需求重命名规则相对比较简单时,则可以基......
  • Session文件包含
    Session文件包含Session文件Session文件的储存由session.save_path来设置​​默认路径/var/lib/php/sess_PHPSESSID/var/lib/php/sessions/sess_PHPSESSID/tmp/sess_PHPSESSID/tmp/sessions/sess_PHPSESSID命名格式默认情况下,session.use_strict_mode​值是0,此......
  • 基于SpringBoot+VUE的学生心理咨询评估系统(源码+文档+部署)
    主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论......
  • 【Azure 存储服务】Azure文件能实现的功能及业务场景的系列问题
    问题一:Azure文件提供的部署方式,云部署/本地部署?当前可用的是哪种方式Azure文件存储可以用于替换或补充传统的本地文件服务器或连接到网络的存储(NSA)设备。Azure文件是云服务,存储的文件都在AzureCloud里,开通本地防火墙445端口(运行在portal上自动生成的powershell脚本),就可以......
  • Java 大文件IO操作效率对比【我说说 你瞅瞅】
    Java文件IO操作效率对比注:本文只做时间消耗层面对比,内存占用层面需要特别关注!参数说明文件总大小:2,111,993,850字节(2.11 GB)staticStringdefaultFilePath="/tmp/data-24081412.json";缓冲区大小:8192字节staticintdefaultByteLength=1024*8;示例介绍通过......
  • Golang文件操作秘籍:ioutil包的终极指南
    Golang文件操作秘籍:ioutil包的终极指南在Go语言的世界中,文件操作是一项基本而常见的任务。Go标准库中的ioutil包提供了一些简便的方法来执行常见的I/O操作,包括文件的读写。本文将深入探讨如何使用ioutil包进行文件读写操作,并提供详细的代码示例,帮助你快速掌握这一技能。io......
  • 使用 Axios 下载文件并更新进度条
    使用Axios下载文件并更新进度条使用axios的onDownloadProgress回调函数实现下载文件,并更新下载进度条。示例代码import{ElMessage}from"element-plus";importaxiosfrom"axios";importtype{AxiosResponse,AxiosProgressEvent}from"axios";import{baseUrl......
  • 课程设计-基于Springboot+Vue的生鲜交易系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89460525基于SpringBoot+Vue的生鲜交易系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1NzmQFwX8e6una-ykZ6KGww?pwd=wa......
  • 课程设计-基于Springboot+Vue的网上书城的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89461644基于SpringBoot+Vue的网上书城开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1EWMhc80qzi_R__dAXMtKVA?pwd=t8pv......
  • Windows 7z 打包排除文件 排除文件夹
    前言全局说明Windowscmd终端bat批处理7z打包排除文件排除文件夹一、说明环境:Windows764位旗舰版MicrosoftWindows[版本6.1.7601]7-Zip24.07(x64):Copyright(c)1999-2024IgorPavlov:2024-06-19二、7z官方帮助C:\ProgramFiles\7-Zip>7z7-Zip......