Amazon s3 从命令式资源试用转向反应式使用,使用()
我正试图从使用资源的强制尝试转变为使用资源的被动尝试,但没有成功。我有下面的代码,我想移动Amazon s3 从命令式资源试用转向反应式使用,使用(),amazon-s3,spring-webflux,project-reactor,Amazon S3,Spring Webflux,Project Reactor,我正试图从使用资源的强制尝试转变为使用资源的被动尝试,但没有成功。我有下面的代码,我想移动 private final AmazonS3 amazonS3; private final String bucket; @Override public Mono<String> getTemplate(String templateId) { return Mono.fromCallable(() -> {
private final AmazonS3 amazonS3;
private final String bucket;
@Override
public Mono<String> getTemplate(String templateId) {
return Mono.fromCallable(() -> {
S3Object s3Object = amazonS3.getObject(bucket, templateId);
try (s3Object) {
return IOUtils.toString(s3Object.getObjectContent());
}
}).subscribeOn(Schedulers.boundedElastic());
}
s3Object未被强制转换为s3Object,因此getObjectContent不存在
然后我看了一眼athttps://projectreactor.io/docs/core/release/reference/ 我想我可能会用一次性的,但是我不知道如何用一次性的东西来包装它
有人知道我该怎么做吗?
谢谢你所采取的方法无法实现这一点。实际上,不可能像您在这里看到的那样使用阻塞API(AWS SDK v1)并以某种方式包装它以使其具有反应性 但是,您可以使用AWS SDK v2(您应该在新开发中使用它),它有一个异步S3客户机(),您可以使用它返回一个
completablefuture
:
CompletableFuture contents=s3AsyncClient
.getObject(GetObjectRequest.builder().build(),新ByteArrayaSyncResponsetTransformer())
.thenappyasync(rb->rb.asUtf8String());
然后,您可以使用
Mono.fromFuture(contents)
从上面的completableFuture
中获取Mono
,根据可能的情况。您可以将其包装为反应型,并在备份线程池中执行(这就是链接中发生的事情,boundedElastic
调度器正在做的事情。)这可以将上面的阻塞代码与反应链连接起来,但这应该是最后的手段。无论你做什么,都不能使阻塞调用本身反应(即,作为事件循环的一部分异步执行。)太好了,我现在明白你的意思了。所以我将尝试转移到AWS SDK v2,它已经是异步的,并使用Mono.fromFuture来转移到反应类型。不确定spring AWS是否支持AWS SDK v2,但我会看看它。Thx。据我所知,他们已经开始了这方面的开发,但我认为它不会在不久的将来发布。
Flux.using(amazonS3.getObject(bucket, templateId),
s3Object -> Flux.just(IOUtils.toString(s3Object.getObjectContent())),
S3Object::close);
CompletableFuture<String> contents = s3AsyncClient
.getObject(GetObjectRequest.builder().build(), new ByteArrayAsyncResponseTransformer<>())
.thenApplyAsync(rb -> rb.asUtf8String());