Walczyłem z TransferManager
wydania przez kilka tygodni i mam nadzieję, aby uzyskać pewne informacje zwrotne,AWS Java TransferManager problem, JVM nie może uzyskać żadnych bardziej rodzime wątki
Mam aplikacji serwera, który czeka dla zadań, które mają być do niego wysłane. Niektóre z tych zadań wymagają przesłania do S3. Zadanie zawiera wszystkie potrzebne mi informacje do przesłania, w tym klucze dostępu.
W moim rzeczywistym kodzie przesłania, muszę utworzyć nowy obiekt S3Client
i TransferManager
za każdym razem, gdy trzeba go przesłać, ponieważ nie znam moich kluczy dostępu z wyprzedzeniem.
Po przetworzeniu przez system około 1200 przesłanych obrazów, wystąpił błąd wskazujący, że maszyna JVM nie mogła uzyskać żadnych natywnych wątków. Dołączyłem profiler do aplikacji i zauważyłem, że obiekt TransferManager
nie został poprawnie oczyszczony, a tysiące wątków "s3-transfer-manager-worker-1" siedzi bezczynnie.
Podjęto próbę dodania połączenia do TransferManager.shutdownNow()
po zakończeniu przesyłania. To oczyściło wątki. Jednak zacząłem otrzymywać RejectedExecutionException
po utworzeniu nowego TransferManager
i próbie załadowania.
TransferManager
zawiera UploadMonitor
i UploadMonitor
ma statyczne ScheduledExecutorService
. TransferManager.shutdownNow()
wywołuje metodę statyczną UploadMonitor.shutdownNow()
, która wywołuje shutdownNow()
w usłudze executora. Dzięki temu nie mogę już używać żadnych obiektów, nawet jeśli spróbuję utworzyć nowy.
Jak korzystać z wielu obiektów przesyłania bez wyczerpania wątków? Wygląda na to, że jest to błąd.
+1 za obserwowanie własnego pytania, dzięki! –