Saya ingin menyetel waktu tunggu koneksi untuk layanan istirahat yang digunakan oleh aplikasi web saya. Saya menggunakan Spring's RestTemplate untuk berbicara dengan layanan saya. Saya telah melakukan beberapa penelitian dan saya telah menemukan dan menggunakan xml di bawah ini (dalam aplikasi saya xml) yang saya yakini dimaksudkan untuk menyetel batas waktu. Saya menggunakan Spring 3.0.
Saya juga melihat masalah yang sama di sini Konfigurasi waktu tunggu untuk layanan web musim semi dengan RestTemplate tetapi solusinya tampaknya tidak bersih , saya lebih suka mengatur nilai batas waktu melalui konfigurasi Spring
<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
<property name="readTimeout" value="${restURL.connectionTimeout}" />
</bean>
</constructor-arg>
</bean>
Tampaknya apa pun yang saya atur readTimeout menjadi saya mendapatkan yang berikut:
Kabel jaringan terputus: Menunggu sekitar 20 detik dan melaporkan pengecualian berikut:
org.springframework.web.client.ResourceAccessExcep tion: Kesalahan I / O: Tidak ada rute ke host: hubungkan; pengecualian bersarang adalah java.net.NoRouteToHostException: Tidak ada rute ke host: sambungkan
Url salah jadi 404 dikembalikan oleh layanan istirahat: Menunggu sekitar 10 detik dan melaporkan pengecualian berikut:
org.springframework.web.client.HttpClientErrorException: 404 Tidak Ditemukan
Persyaratan saya memerlukan waktu tunggu yang lebih singkat, jadi saya harus dapat mengubahnya. Ada ide tentang apa yang saya lakukan salah?
Terimakasih banyak.
sumber
new
pernyataan ganjil dalamSpring Boot
contohconnectionRequestTimeout
atribut tidak tersedia sebelum 4.1.4. RELEASESaya akhirnya berhasil.
Saya pikir fakta bahwa proyek kami memiliki dua versi berbeda dari jar commons-httpclient tidak membantu. Setelah saya menyelesaikannya, saya menemukan Anda dapat melakukan dua hal ...
Dalam kode Anda dapat meletakkan yang berikut ini:
Pertama kali kode ini dipanggil, waktu tunggu untuk
HttpComponentsClientHttpRequestFactory
kelas yang digunakan olehRestTemplate
. Oleh karena itu, semua panggilan berikutnya yang dilakukan olehRestTemplate
akan menggunakan pengaturan waktu tunggu yang ditentukan di atas.Atau opsi yang lebih baik adalah melakukan ini:
Di mana saya menggunakan
RestOperations
antarmuka dalam kode saya dan mendapatkan nilai batas waktu dari file properti.sumber
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Pertanyaan ini adalah tautan pertama untuk pencarian Spring Boot, oleh karena itu, akan sangat bagus untuk meletakkan di sini solusi yang direkomendasikan dalam dokumentasi resmi . Spring Boot memiliki kacang kenyamanannya sendiri RestTemplateBuilder :
Pembuatan instans RestTemplate secara manual adalah pendekatan yang berpotensi merepotkan karena kacang yang dikonfigurasi secara otomatis lainnya tidak dimasukkan dalam instans yang dibuat secara manual.
sumber
setConnectTimeout
dan beberapa implementasisetReadTimeout
tidak digunakan lagiIni 2 sen saya. Tidak ada yang baru, tetapi beberapa penjelasan, peningkatan, dan kode yang lebih baru.
Secara default,
RestTemplate
memiliki waktu tunggu tak terbatas. Ada dua jenis batas waktu: batas waktu koneksi dan batas waktu pembacaan. Misalnya, saya dapat terhubung ke server tetapi saya tidak dapat membaca data. Aplikasi hang dan Anda tidak tahu apa yang sedang terjadi.Saya akan menggunakan anotasi, yang sekarang lebih disukai daripada XML.
Disini kita gunakan
SimpleClientHttpRequestFactory
untuk mengatur koneksi dan membaca waktu habis. Ini kemudian diteruskan ke konstruktor dariRestTemplate
.Dalam solusi kedua, kami menggunakan
RestTemplateBuilder
. Perhatikan juga parameter dari dua metode: mereka mengambilDuration
. Metode kelebihan beban yang memakan waktu langsung dalam milidetik sekarang sudah tidak digunakan lagi.Edit Diuji dengan Spring Boot 2.1.0 dan Java 11.
sumber
Berikut ini cara yang sangat sederhana untuk menyetel waktu tunggu:
sumber
Saya memiliki skenario serupa, tetapi juga diminta untuk mengatur Proxy. Cara paling sederhana yang dapat saya lihat untuk melakukan ini adalah dengan memperluas
SimpleClientHttpRequestFactory
kemudahan pengaturan proxy (proxy berbeda untuk non-prod vs prod). Ini harus tetap berfungsi meskipun Anda tidak memerlukan proxy. Kemudian di kelas saya yang diperluas, saya menggantiopenConnection(URL url, Proxy proxy)
metode, menggunakan sama dengan sumber , tetapi hanya mengatur batas waktu sebelum kembali.sumber
Untuk memperluas jawaban benscabbia :
sumber
Ganti waktu tunggu dengan SimpleClientHttpRequestFactory
HTTPClient menyediakan fitur berguna lainnya seperti kumpulan koneksi, manajemen koneksi idle, dll.
Read More: Contoh konfigurasi Spring RestTemplate + HttpClient
Ganti waktu tunggu dengan HttpComponentsClientHttpRequestFactory
referensi: Contoh konfigurasi timeout Spring RestTemplate
sumber