在 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
的新实现?如果是这样,registerConnectionManager
和 deregisterConnectionManager
方法中的 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 客户端对象(和对象内容流!),您会没事的。
我正在使用来自 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
的新实现?如果是这样,registerConnectionManager
和 deregisterConnectionManager
方法中的 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 客户端对象(和对象内容流!),您会没事的。