Spring 使用 Spring 云 AWS S3 returns 301 的 EU 存储桶批处理
Spring Batch with Spring Cloud AWS S3 returns 301 for EU bucket
我正在尝试读取托管在 S3 上的 Spring 批处理中的文件。我想直接从S3访问该文件,而不是将其下载为本地文件然后读取。
这是我的 reader:
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")
}
}
reader 在我的批处理配置文件中连接:
@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;
}
有没有办法在使用资源加载器时明确指定区域?
好的,所以问题在于存储桶未设置且为空。
@Value('${com.me.s3bucket}')
private String s3bucket;
我不知道这是为什么,但是当我将其移出 class 并将该值作为作业参数发送时,它起作用了。
我正在尝试读取托管在 S3 上的 Spring 批处理中的文件。我想直接从S3访问该文件,而不是将其下载为本地文件然后读取。
这是我的 reader:
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")
}
}
reader 在我的批处理配置文件中连接:
@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;
}
有没有办法在使用资源加载器时明确指定区域?
好的,所以问题在于存储桶未设置且为空。
@Value('${com.me.s3bucket}')
private String s3bucket;
我不知道这是为什么,但是当我将其移出 class 并将该值作为作业参数发送时,它起作用了。