spring 是否有一种方法可以用Reactor异步读取InputStream或转换为字节?

7gyucuyw  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(184)

我试图上传一个文件到S3,但是JVM说我在代码片段中有一个线程阻塞方法调用,在代码片段中,当调用file.readAllBytes()时,线程不应该被阻塞,所以有没有办法让这个方法与Flux或Mono异步?或者有没有其他办法来解决这个问题?

private Mono<Boolean> uploadFile(InputStream file, String bucket, String name) {
        try {
            return uploadAdapter.uploadObject(bucket,name,file.readAllBytes());
        } catch (IOException e) {
            return Mono.just(false);
        }
    }
@Override
    public Mono<Boolean> uploadObject(String bucketName, String objectKey, byte[] fileContent) {
        return Mono.fromFuture(
                        s3AsyncClient.putObject(configurePutObject(bucketName, objectKey),
                                AsyncRequestBody.fromBytes(fileContent)))
                .map(response -> response.sdkHttpResponse().isSuccessful());
    }
q1qsirdb

q1qsirdb1#

由于InputStream是一个同步API,因此您有两个选择,对于任何其他同步API也是如此:
1.切换到另一个API。这可能是一个很好的解决方案,可以解决很多问题。React式概念和异步是非常常见的,对于大多数需求,有一个替代的异步库可以做同样的事情。在你的情况下,你可以使用java.nio2,或者来自Reactor-Netty库的函数,它有很好的解决方案。
1.使用另一个调度程序。Project reactor建议所有异步调用都在一个非阻塞调度程序上操作,而对于同步调用,请使用另一个(阻塞)每个请求线程的调度程序。有两个类似的调度程序可以用途:single()boundedElastic()。不同之处在于boundedElastic()限制了可以打开的线程数,因此您最终会将线程用作阻塞队列,这比single()更安全。

相关问题