Проблема с AWS Java TransferManager, JVM не удалось получить больше нативных потоков

Я борюсь с проблемой TransferManager уже несколько недель, и я надеюсь получить обратную связь.

У меня есть серверное приложение, которое ожидает отправки задач. Некоторые из этих задач требуют загрузки в S3. Задача содержит всю необходимую мне информацию для загрузки, включая ключи доступа.

В моем фактическом коде загрузки мне нужно создавать новые объекты S3Client и TransferManager каждый раз, когда мне нужно выполнить загрузку, потому что я не знаю свои ключи доступа заранее. .

После того, как система обработала примерно 1200 загрузок, я получил сообщение об ошибке, указывающее, что JVM не может получить больше собственных потоков. Я подключил профилировщик к приложению и заметил, что объект TransferManager не очищался должным образом, тысячи потоков «s3-transfer-manager-worker-1» простаивали.

Я попытался добавить вызов TransferManager.shutdownNow () после завершения загрузки. Это очистило потоки. Однако я начал получать исключение RejectedExecutionException всякий раз, когда создавался новый TransferManager и предпринималась попытка загрузки.

TransferManager содержит UploadMonitor , а UploadMonitor имеет статическую ScheduledExecutorService . TransferManager.shutdownNow () вызывает статический метод UploadMonitor.shutdownNow () , который вызывает shutdownNow () в службе исполнителя.Это делает так, что я больше не могу использовать какие-либо объекты TransferManager , даже если я попытаюсь создать новый.

Как мне использовать несколько объектов передачи без исчерпания потоков? Похоже, это ошибка.

6
задан 30thh 22 August 2014 в 09:03
поделиться