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

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

时间:2024-08-14 21:06:52浏览次数:12  
标签:文件 Quartz S3 s3 import org public

在Spring Boot中实现使用Quartz定时任务轮询AWS S3 Bucket,并根据文件的最后修改日期确定是否需要下载文件的功能。

步骤一:添加依赖

pom.xml中添加Spring Boot、Quartz和AWS SDK的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.17.27</version> <!-- 根据需要选择版本 -->
</dependency>

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

application.propertiesapplication.yml中配置AWS S3相关的信息:

aws.s3.bucketName=your-bucket-name
aws.region=your-region
aws.s3.downloadFolder=/path/to/download/folder

步骤三:创建S3服务类

创建一个服务类,用于封装与S3的交互逻辑,包括列出文件、下载文件和检查文件的最后修改时间。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
import software.amazon.awssdk.services.s3.model.S3Object;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

@Service
public class S3Service {

    private final S3Client s3Client;
    private final String bucketName;
    private final String downloadFolder;

    public S3Service(@Value("${aws.s3.bucketName}") String bucketName,
                     @Value("${aws.region}") String region,
                     @Value("${aws.s3.downloadFolder}") String downloadFolder) {
        this.s3Client = S3Client.builder()
                .region(Region.of(region))
                .credentialsProvider(DefaultCredentialsProvider.create())
                .build();
        this.bucketName = bucketName;
        this.downloadFolder = downloadFolder;
    }

    // 列出Bucket中的所有文件
    public List<S3Object> listFiles() {
        ListObjectsV2Request request = ListObjectsV2Request.builder()
                .bucket(bucketName)
                .build();

        ListObjectsV2Response response = s3Client.listObjectsV2(request);
        return response.contents();
    }

    // 下载文件
    public void downloadFile(String keyName) throws IOException {
        GetObjectRequest request = GetObjectRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .build();

        File file = new File(downloadFolder + "/" + keyName);
        try (FileOutputStream fos = new FileOutputStream(file);
             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: " + file.getAbsolutePath());
    }

    // 检查文件是否已经下载过
    public boolean isFileDownloaded(String keyName) {
        return Files.exists(Paths.get(downloadFolder + "/" + keyName));
    }
}

步骤四:创建Quartz定时任务

创建Quartz任务类,定期轮询S3 Bucket,并根据文件的最后修改日期确定是否下载文件。

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.services.s3.model.S3Object;

import java.io.IOException;
import java.util.List;

@Component
public class S3FilePollingJob implements Job {

    private final S3Service s3Service;

    @Autowired
    public S3FilePollingJob(S3Service s3Service) {
        this.s3Service = s3Service;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 获取S3中的文件列表
        List<S3Object> s3Objects = s3Service.listFiles();

        for (S3Object s3Object : s3Objects) {
            String keyName = s3Object.key();
            if (!s3Service.isFileDownloaded(keyName)) {
                try {
                    s3Service.downloadFile(keyName);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("File already downloaded: " + keyName);
            }
        }
    }
}

步骤五:配置Quartz定时任务

在Spring Boot配置类中配置Quartz定时任务的执行频率。

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail s3FilePollingJobDetail() {
        return JobBuilder.newJob(S3FilePollingJob.class)
                .withIdentity("s3FilePollingJob")
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger s3FilePollingTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(s3FilePollingJobDetail())
                .withIdentity("s3FilePollingTrigger")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMinutes(5)  // 每5分钟轮询一次
                        .repeatForever())
                .build();
    }
}

步骤六:启动Spring Boot应用程序

确保所有配置和代码都正确之后,启动Spring Boot应用程序。应用程序将每5分钟(或你配置的间隔)轮询一次S3 Bucket,并下载任何未下载过的文件。

以上

此方法简单且有效,适合在文件变化不太频繁的情况下使用。如果文件变化较为频繁,可以考虑使用S3事件通知与SQS的方式进行实时监听。

标签:文件,Quartz,S3,s3,import,org,public
From: https://www.cnblogs.com/gongchengship/p/18359764

相关文章

  • 利用git插件git LFS实现大文件上传
    目录利用git插件gitLFS实现大文件上传原因:gitLFS下载链接前提命令执行部分:第一步,跟踪:检查跟踪情况:第二步:添加和提交跟踪文件第三步:提交收工注意:利用git插件gitLFS实现大文件上传原因:gitub默认文件传送为100MB,有时我们要上传大于100MB大小文件gitLFS下载链接https://www.y......
  • Spring boot 集成 S3 进行文件读写删改
    步骤一:添加依赖首先,在SpringBoot项目中添加AWSS3相关的依赖。如果你使用Maven,可以在pom.xml中添加以下依赖:<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.17.27</version><!--请根据需要选择最新版本......
  • Spring boot 要监听 S3 上的文件, 当有新文件到来时,下载新文件(SQS 版)
    要在SpringBoot中实现对AWSS3上新文件的监听并自动下载的功能,可以通过以下几种方式实现:1.使用AWSLambda和S3EventNotification配置S3Bucket的事件通知,当有新文件上传到S3时,触发AWSLambda函数。Lambda函数调用SpringBoot应用的API来通知新文件的到来。这种方法需要配......
  • 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,此......
  • 【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......
  • 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......