私は今、数週間TransferManager
問題と戦ってきたと私はいくつかのフィードバックを得るために期待しています、AWSのJava TransferManagerの問題、JVMは、任意のより多くのネイティブスレッドを得ることができませんでした
私は待機サーバアプリケーションを持っていますタスクがそのタスクに送信されるようにします。これらのタスクの中には、S3へのアップロードが必要なものがあります。タスクには、アクセスキーを含む必要なすべてのアップロード情報が含まれています。
私の実際のアップロードコードでは、事前にアクセスキーがわからないため、アップロードする必要があるたびに新しいS3Client
とTransferManager
オブジェクトを作成する必要があります。
システムが約1200のアップロードを処理した後、JVMがそれ以上のネイティブスレッドを取得できなかったことを示すエラーが表示されました。私はアプリケーションにプロファイラを添付して、TransferManager
オブジェクトが正しくクリーンアップされていないことに気付きました。何千もの "s3-transfer-manager-worker-1"スレッドがアイドル状態になっていました。
アップロードが完了した後にTransferManager.shutdownNow()
への呼び出しを追加しようとしました。それはスレッドをクリーンアップしました。しかし、新しいTransferManager
が作成され、アップロードが試みられたときはいつも、私はRejectedExecutionException
を受け取り始めました。
TransferManager
は、UploadMonitor
を含み、UploadMonitor
は、スタティックScheduledExecutorService
を持っています。 TransferManager.shutdownNow()
は、ExecutorサービスでshutdownNow()
を呼び出す静的メソッドUploadMonitor.shutdownNow()
を呼び出します。これにより、新しいオブジェクトを作成しようとしても、もはやTransferManager
オブジェクトを使用できなくなります。
スレッドを使い果たすことなく複数の転送オブジェクトを使用するにはどうすればよいですか?これはバグのようです。
+1ご自身の質問にお答えしてください! –