Kiedy opracowałem kawałek (akademickiego) oprogramowania wykorzystującego Javę, zmuszony byłem użyć API, który został źle wdrożony. Oznacza to, że wywołania tego interfejsu API dla określonego zestawu danych wejściowych czasami nigdy nie powrócą. Musiał to być błąd w oprogramowaniu, ponieważ oferowane przez niego algorytmy były deterministyczne, a czasami kończyłoby się na zbiorze danych, czasami działałby w nieskończoną pętlę na tym samym zbiorze danych ...Jak wyizolować program z połączeń na "zły" interfejs API?
Naprawianie lub ponowne wdrażanie interfejsu API było jednak poza zakresem. Miałem nawet źródło, ale API silnie polegało na innych API, które były nieudokumentowane i bez źródła, a do tego czasu zniknęły z sieci (lub nigdy tam nie były?). Z drugiej strony ten "zły" API był jedynym, który rozwiązał konkretny problem, który miałem, więc naprawdę musiałem się z tym uporać.
Pytanie brzmi: jaki jest najczystszy sposób radzenia sobie z interfejsem API, który zachowuje się tak, nieprzyjemnie? Kiedy stanąłem przed tym problemem, postanowiłem umieścić wywołania interfejsu API w osobnym wątku. Inny wątek czasami sprawdzałby, czy wątek został zakończony. Jeśli upłynął pewien czas, zabiłbym wątek przetwarzania za pomocą Thread#stop()
i ponownie rozpoczynam przetwarzanie, mając nadzieję, że nastąpi ono następnym razem. Teraz wiem (i wiedziałem wtedy), że ta metoda jest przestarzała i nie wolno jej używać. Ale w tym kontekście akademickim było dopuszczalne, aby oprogramowanie mogło być niezdefiniowane, zamiast powodować awarię.
Niedopuszczalne było także ignorowanie wątku przetwarzania, który został uruchomiony w nieskończonej pętli, ponieważ wykonał on dość intensywne operacje, które znacznie spowolniłyby pracę maszyny użytkownika.
Innym sposobem, którego nie próbowałem, jest rozpoczęcie przetwarzania w oddzielnym procesie zamiast wątku, ponieważ pod-proces może zostać całkowicie zniszczony bez wprowadzania oprogramowania w niespójny stan. A może nowa klasa SwingWorker
(która nie była jeszcze dostępna) wykonała zadanie? Ma on metodę cancel()
, ale dokumentacja mówi, że jest to "Próba anulowania wykonania tego zadania", więc nie wygląda na niezawodne podejście.
Zaakceptowałem twoją odpowiedź z powodu interesującego odniesienia do Isolation API. Dziękuję za to! –