Inne odpowiedzi wydają się nie wyjaśniać, dlaczego close()
jest to naprawdę konieczne? * 2
Wątpliwości dotyczące odpowiedzi „Cofnięcie alokacji zasobów HttpClient”.
Jest wspomniany w starym dokumencie httpcomponents 3.x , który jest dawno temu i różni się znacznie od HC 4.x. Poza tym wyjaśnienie jest tak krótkie, że nie mówi, czym jest ten podstawowy zasób.
Zrobiłem trochę badań nad kodem źródłowym wydania 4.5.2, stwierdziłem, że implementacje w CloseableHttpClient:close()
zasadzie tylko zamyka jego menedżera połączeń.
(FYI) Dlatego, gdy używasz współdzielonego PoolingClientConnectionManager
i wywołującego klienta close()
, java.lang.IllegalStateException: Connection pool shut down
wystąpi wyjątek . Aby tego uniknąć, setConnectionManagerShared
działa.
Wolę nie robić CloseableHttpClient:close()
po każdej prośbie
Kiedyś tworzyłem nową instancję klienta http podczas wykonywania żądania i ostatecznie ją zamykałem. W takim przypadku lepiej nie dzwonić close()
. Ponieważ, jeśli menedżer połączeń nie ma flagi „udostępniony”, zostanie zamknięty, co jest zbyt kosztowne dla pojedynczego żądania.
W rzeczywistości znalazłem również w bibliotece clj-http , opakowanie Clojure nad Apache HC 4.5, w ogóle nie wywołuje close()
. Zobacz func request
w pliku core.clj