要在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队列。
- 打开S3控制台,选择你的Bucket。
- 转到属性,找到事件通知,点击创建事件通知。
- 为事件命名,并选择需要监听的事件类型,例如
PUT
(文件上传)。 - 在目标部分选择SQS队列,并选择相应的队列。
步骤二:在Spring Boot中配置SQS监听器
在Spring Boot应用中使用@SqsListener
注解监听SQS消息,并处理文件下载。
-
添加依赖
在
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>
-
配置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