2011-12-22 6 views
6

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.

Odpowiedz