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