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

要在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上有新文件上传时自动响应并下载该文件。这样的方法不仅避免了持续轮询带来的资源浪费,还能确保新文件能及时处理。

posted @ 2024-08-14 20:51  gongchengship  阅读(13)  评论(0编辑  收藏  举报