Я борюсь с проблемой 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
, даже если я попытаюсь создать новый.
Как мне использовать несколько объектов передачи без исчерпания потоков? Похоже, это ошибка.