【问题标题】:Spring Batch with Spring Cloud AWS S3 returns 301 for EU bucket带有 Spring Cloud AWS S3 的 Spring Batch 为 EU 存储桶返回 301
【发布时间】:2015-07-21 18:57:16
【问题描述】:

我正在尝试读取托管在 S3 上的 Spring Batch 中的文件。我想直接从 S3 访问该文件,而不是将其作为本地文件下载然后读取。

这是我的读者:

class MyReader extends FlatFileItemReader<MyReadItem> {

    @Value('${com.me.s3bucket}')
    private String s3bucket;

    MyReader (DefaultLineMapper< MyReadItem > myLineMapper, ResourceLoader resourceLoader) {
        this.linesToSkip = 1
        this.lineMapper = myLineMapper
        this.resource = resourceLoader.getResource("s3://${s3bucket}/path/to/myfile.csv")
    }
}

阅读器已连接到我的批处理配置文件中:

@Bean
public ItemReader< MyReadItem > reader() {
    return new MyReader(myLineMapper(), resourceLoader)
}

@Autowired
ResourceLoader resourceLoader

// myLineMapper ...

当我运行批处理作业时,我得到一个 301 异常:

Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: Moved Permanently (Service: Amazon S3; Status Code: 301; Error Code: 301 Moved Permanently; Request ID: 1DAB29F45F62E0D9)

S3 301 异常似乎是因为在发出请求时未定义区域 (example here),但我的 application.yaml 文件显示在下面我定义区域的位置:

cloud:
    aws:
        region:
            static: eu-west-1
            auto: false

这里发生了什么?问题是否与连接 bean 的顺序有关,可能是在读取配置文件之前?

为了测试,我使用这种方法将 S3 作为临时文件下载到同一个应用程序中,并且可以正常工作:

@Value('${com.me.s3bucket}')
private String s3bucket;

public static final String PREFIX = "s3temp";
public static final String SUFFIX = ".tmp";

public File downloadS3File(String resourcePath) throws IOException {
    Resource resource = this.resourceLoader.getResource("s3://${s3bucket}/${resourcePath}");

    InputStream inputStream = resource.getInputStream();

    final File tempFile = File.createTempFile(PREFIX, SUFFIX);
    tempFile.deleteOnExit();
    try {
        FileOutputStream out = new FileOutputStream(tempFile)
        IOUtils.copy(inputStream, out);
    }
    finally {
    }

    return tempFile;
}

在使用资源加载器时,有什么方法可以显式指定区域吗?

【问题讨论】:

    标签: spring amazon-s3 spring-boot spring-batch spring-cloud


    【解决方案1】:

    好的,所以问题在于存储桶没有被设置并且为空。

    @Value('${com.me.s3bucket}')
    private String s3bucket;
    

    我不知道为什么会这样,但是当我将它移出类并将值作为作业参数发送时,它起作用了。

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2018-04-27
      • 2020-08-12
      • 2014-09-04
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2018-11-12
      • 2021-02-20
      相关资源
      最近更新 更多