2011-12-22 8 views
6

私は今、数週間TransferManager問題と戦ってきたと私はいくつかのフィードバックを得るために期待しています、AWSのJava TransferManagerの問題、JVMは、任意のより多くのネイティブスレッドを得ることができませんでした

私は待機サーバアプリケーションを持っていますタスクがそのタスクに送信されるようにします。これらのタスクの中には、S3へのアップロードが必要なものがあります。タスクには、アクセスキーを含む必要なすべてのアップロード情報が含まれています。

私の実際のアップロードコードでは、事前にアクセスキーがわからないため、アップロードする必要があるたびに新しいS3ClientTransferManagerオブジェクトを作成する必要があります。

システムが約1200のアップロードを処理した後、JVMがそれ以上のネイティブスレッドを取得できなかったことを示すエラーが表示されました。私はアプリケーションにプロファイラを添付して、TransferManagerオブジェクトが正しくクリーンアップされていないことに気付きました。何千もの "s3-transfer-manager-worker-1"スレッドがアイドル状態になっていました。

アップロードが完了した後にTransferManager.shutdownNow()への呼び出しを追加しようとしました。それはスレッドをクリーンアップしました。しかし、新しいTransferManagerが作成され、アップロードが試みられたときはいつも、私はRejectedExecutionExceptionを受け取り始めました。

TransferManagerは、UploadMonitorを含み、UploadMonitorは、スタティックScheduledExecutorServiceを持っています。 TransferManager.shutdownNow()は、ExecutorサービスでshutdownNow()を呼び出す静的メソッドUploadMonitor.shutdownNow()を呼び出します。これにより、新しいオブジェクトを作成しようとしても、もはやTransferManagerオブジェクトを使用できなくなります。

スレッドを使い果たすことなく複数の転送オブジェクトを使用するにはどうすればよいですか?これはバグのようです。

答えて