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());