Saya ingin membuat BIT (Tes bawaan) ke sejumlah server di cloud saya. Saya perlu permintaan gagal pada waktu tunggu yang lama.
Bagaimana saya harus melakukan ini dengan java?
Mencoba sesuatu seperti di bawah ini sepertinya tidak berhasil.
public class TestNodeAliveness {
public static NodeStatus nodeBIT(String elasticIP) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter("http.connection.timeout", 1);
HttpUriRequest request = new HttpGet("http://192.168.20.43");
HttpResponse response = client.execute(request);
System.out.println(response.toString());
return null;
}
public static void main(String[] args) throws ClientProtocolException, IOException {
nodeBIT("");
}
}
- EDIT: Memperjelas perpustakaan apa yang sedang digunakan -
Saya menggunakan httpclient dari apache, berikut adalah bagian pom.xml yang relevan
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<type>jar</type>
</dependency>
java
http
timeout
network-protocols
Maxim Veksler
sumber
sumber
Jawaban:
import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; ... // set the connection timeout value to 30 seconds (30000 milliseconds) final HttpParams httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 30000); client = new DefaultHttpClient(httpParams);
sumber
Jika Anda menggunakan Http Client versi 4.3 dan di atasnya, Anda harus menggunakan ini:
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build(); HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
sumber
SocketTimeout
. Juga, apakah "default" berarti itu default untuk semuaHttpClient
yangHttpClientBuilder
dari create () akan berikan melaluibuild()
metode? Atau hanya yang lewatsetDefaultRequestConfig(requestConfig)
? Apakah saya masuk akal?HttpParams tidak digunakan lagi di perpustakaan Apache HTTPClient baru. Menggunakan kode yang disediakan oleh Laz mengarah ke peringatan deprecation.
Saya menyarankan untuk menggunakan RequestConfig sebagai gantinya pada HttpGet atau contoh HttpPost Anda:
final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build(); httpPost.setConfig(params);
sumber
RequestConfig
ke setiapHttpPost
dan bukan menyetelnya sebagai default keHttpClient
?Sepertinya Anda menggunakan HttpClient API, yang saya tidak tahu apa-apa, tetapi Anda bisa menulis sesuatu yang mirip dengan ini menggunakan inti Java.
try { HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setRequestMethod("HEAD"); con.setConnectTimeout(5000); //set timeout to 5 seconds return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (java.net.SocketTimeoutException e) { return false; } catch (java.io.IOException e) { return false; }
sumber
Saya menemukan bahwa mengatur pengaturan waktu keluar
HttpConnectionParams
danHttpConnectionManager
tidak menyelesaikan kasus kami. Kami terbatas untuk menggunakanorg.apache.commons.httpclient
versi 3.0.1.Saya akhirnya menggunakan
java.util.concurrent.ExecutorService
untuk memantauHttpClient.executeMethod()
panggilan.Berikut adalah contoh kecil yang berdiri sendiri
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.EntityEnclosingMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.concurrent.*; /** * @author Jeff Kirby * @since <pre>Jun 17, 2011</pre> */ public class Example { private static final String SITE = "http://some.website.com/upload"; private static final int TIME_OUT_SECS = 5; // upload a file and return the response as a string public String post(File file) throws IOException, InterruptedException { final Part[] multiPart = { new FilePart("file", file.getName(), file) }; final EntityEnclosingMethod post = new PostMethod(SITE); post.setRequestEntity(new MultipartRequestEntity(multiPart, post.getParams())); final ExecutorService executor = Executors.newSingleThreadExecutor(); final List<Future<Integer>> futures = executor.invokeAll(Arrays.asList(new KillableHttpClient(post)), TIME_OUT_SECS, TimeUnit.SECONDS); executor.shutdown(); if(futures.get(0).isCancelled()) { throw new IOException(SITE + " has timed out. It has taken more than " + TIME_OUT_SECS + " seconds to respond"); } return post.getResponseBodyAsString(); } private static class KillableHttpClient implements Callable<Integer> { private final EntityEnclosingMethod post; private KillableHttpClient(EntityEnclosingMethod post) { this.post = post; } public Integer call() throws Exception { return new HttpClient().executeMethod(post); } } }
sumber
Metode tersebut dengan up tertinggi oleh Laz tidak digunakan lagi mulai versi 4.3 dan seterusnya. Oleh karena itu, akan lebih baik untuk menggunakan Objek Konfigurasi Permintaan dan kemudian membangun Klien HTTP
private CloseableHttpClient createHttpClient() { CloseableHttpClient httpClient; CommonHelperFunctions helperFunctions = new CommonHelperFunctions(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(306); cm.setDefaultMaxPerRoute(108); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(15000) .setSocketTimeout(15000).build(); httpClient = HttpClients.custom() .setConnectionManager(cm) .setDefaultRequestConfig(requestConfig).build(); return httpClient; }
PoolingHttpClientConnectionManager adalah pengguna yang mengatur jumlah koneksi default maksimum dan jumlah koneksi maksimum per rute. Saya telah menetapkannya masing-masing sebagai 306 dan 108. Nilai default tidak akan cukup untuk sebagian besar kasus.
Untuk mengatur Timeout: Saya telah menggunakan objek RequestConfig. Anda juga dapat mengatur properti Connection Request Timeout untuk mengatur waktu tunggu untuk menunggu koneksi dari Connection manager.
sumber
Ini sudah disebutkan dalam komentar oleh benvoliot atas. Tapi, saya pikir itu layak untuk posting tingkat atas karena itu pasti membuat saya menggaruk-garuk kepala. Saya memposting ini kalau-kalau itu membantu orang lain.
Saya menulis klien uji sederhana dan
CoreConnectionPNames.CONNECTION_TIMEOUT
batas waktu berfungsi dengan sempurna dalam kasus itu. Permintaan dibatalkan jika server tidak merespons.Di dalam kode server yang sebenarnya saya coba uji, kode identik tidak pernah habis.
Mengubahnya ke waktu habis pada aktivitas koneksi soket (
CoreConnectionPNames.SO_TIMEOUT
) daripada koneksi HTTP (CoreConnectionPNames.CONNECTION_TIMEOUT
) memperbaiki masalah bagi saya.Juga, baca dokumen Apache dengan seksama: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT
Perhatikan bagian yang mengatakan
Saya berharap itu menyelamatkan orang lain dari semua garukan kepala yang saya alami. Itu akan mengajari saya untuk tidak membaca dokumentasi secara menyeluruh!
sumber
Op kemudian menyatakan bahwa mereka menggunakan Apache Commons HttpClient 3.0.1
HttpClient client = new HttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); client.getHttpConnectionManager().getParams().setSoTimeout(5000);
sumber
HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout
Anda juga dapat menentukan waktu istirahat yang Anda inginkan.
sumber