在 AWS Java SDK v2 中关闭 IdleConnectionReaper

Shutdown IdleConnectionReaper in AWS Java SDK v2

我正在使用来自 Java SDK v2 的 S3Client。到分布式 Web 应用程序中来自 AWS S3 的 upload/download 个文件。

我遇到了 idle-connection-reaper 守护进程线程 preventing/delaying 的问题,class 在关闭期间被卸载。我做了一些调查,发现在 AWS Java SDK v1 中,这可以通过调用 IdleConnectionReaper.shutdown() 方法来解决。

我将 apache 客户端导入到我的项目中

<!-- https://mvnrepository.com/artifact/software.amazon.awssdk/apache-client -->
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>apache-client</artifactId>
    <version>2.17.162</version>
</dependency>

我想使用 AWS Java SDK v2 做同样的事情。问题是 shutdown() 方法不再是静态和公开的。

他们将 class 更改为单例,唯一公开的 API 是:

public synchronized boolean registerConnectionManager(HttpClientConnectionManager manager, long maxIdleTime)

public synchronized boolean deregisterConnectionManager(HttpClientConnectionManager manager)

deregisterConnectionManager() 在内部调用 shutdown 但我不知道 HttpClientConnectionManager 我应该为这两种方法提供什么作为参数

我的问题是:是否有另一种方法可以关闭守护线程,或者我应该坚持使用 IdleConnectionReaper 的新实现?如果是这样,registerConnectionManagerderegisterConnectionManager 方法中的 HttpClientConnectionManager 参数到底是什么?

再分析一下: 内部 ReaperTask 有 1 分钟的休眠时间,在此期间它不检查其 'stopping' 标志 - 因此它没有意识到它应该关闭。但是,一旦最后一个连接管理器被重新注册,它将 interrupted/shut 关闭。

在我这边,问题是使用带有注入 HttpClient 的 SDK 构建器(也由 SDK 构建器构建)。这会导致围绕它进行包装,防止在关闭外部客户端时注销。

您不再需要与 v2 IdleConnectionReaper 交互,这就是 public 界面已更改以反映这一点的原因。

AWS Java SDK v1 和 v2 在 S3 客户端方面有一个关键区别。

V1的AmazonS3Client implements the AmazonS3 custom interface which provides the shutdown方法待实现。

这不是强制执行的,并且是一种可选方法,所以我假设需要守护线程来防止泄漏,以防 S3 客户端在任何地方都没有关闭。

V2的S3Client implements the AutoClosable接口,java.lang版本7之后的固有接口。

对于 AutoClosable,AWS SDK 清楚地传达了您的应用程序管理 S3 客户端关闭和清理的期望。这最好通过将客户端的关闭委托给 JVM 来完成,方法是将其包含在 try-with-resources 语句中,或者如果需要,通过 S3Client.close().

显式地完成。

AWS Java SDK v2 利用 Java 语言的更新功能,因此,它希望您根据现代 Java 开发实践正确处理您的资源。

正确关闭您的 S3 客户端对象(和对象内容流!),您会没事的。