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