java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient進行異步HTTP請求
前段時間有個需求在springmvc mapping的url跳轉前完成一個統計的業務。顯然需要進行異步的處理,不然出錯或者異常會影響到后面的網頁跳轉。異步的方式也就是非阻塞式的,當異步調用成功與否程序會接著往下執行,不必等到輸入輸出處理完畢才返回。
主要用到httpasyncclient-4.0.1.jar,httpclient-4.3.2.jar,httpcore-4.3.2.jar,httpcore-nio-4.3.2.jar,commons-logging-1.1.3.jar。
java.util.concurrent中主要包括三類工具,Executor Freamework,并發集合(Concurrent Collection),以及同步器(Synchronizer)。下面的例子是利用java.util.concurrent.Future只請求一個 url異步請求。Future接口表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并獲取計算的結果。計算完成后只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執行。還提供了其他方法,以確定任務是正常完成還是被取消了。一旦計算完成,就不能再取消計算。如果為了可取消性而使用 Future 但又不提供可用的結果,則可以聲明 Future> 形式類型、并返回 null 作為底層任務的結果。
import java.util.concurrent.Future;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
/**
* This example demonstrates a basic asynchronous HTTP request / response
* exchange. Response content is buffered in memory for simplicity.
*/
public class AsyncClientHttpExchange {
public static void main(final String[] args) throws Exception {
CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();// 默認的配置
try {
httpclient.start();
HttpGet request = new HttpGet("http://www.apache.org/");
Future future = httpclient.execute(request, null);
HttpResponse response = future.get();// 獲取結果
System.out.println("Response: " + response.getStatusLine());
System.out.println("Shutting down");
} finally {
httpclient.close();
}
System.out.println("Done");
}
}
同步器(Synchronizer)是一些使線程能夠等待另一個線程的對象,允許它們協作,最常用的同步器是CountDownLatch和
Semaphore。較不常用的是CyclicBarrier和Exchanger。Semaphore類是一個計數信號量。從概念上講,信號量維護了一
個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release()
添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數,并采取相應的行動。
CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數 初始化
CountDownLatch。由于調用了 countDown() 方法,所以在當前計數到達零之前,await
方法會一直受阻塞。之后,會釋放所有等待的線程,await
的所有后續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,可使用
CyclicBarrier。倒計數索存器(CountDownLatch)是一次性的障礙。它的唯一構造器帶有一個int類型的參數,這個參數是指允許
所有的等待線程處理之前,必須在鎖存器上調用countDown()方法的次數。這一點非常有用。下面是異步請求一組url的例子,利用callback
借口完成獨立的操作。
import java.util.concurrent.CountDownLatch;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
/**
* This example demonstrates a fully asynchronous execution of multiple HTTP
* exchanges where the result of an individual operation is reported using a
* callback interface.
*/
public class AsyncClientHttpExchangeFutureCallback {
public static void main(final String[] args) throws Exception {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(3000).setConnectTimeout(3000).build();
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig).build();
try {
httpclient.start();
final HttpGet[] requests = new HttpGet[] {
new HttpGet("http://www.apache.org/"),
new HttpGet("https://www.verisign.com/"),
new HttpGet("http://www.google.com/"),
new HttpGet("http://www.baidu.com/") };
final CountDownLatch latch = new CountDownLatch(requests.length);
for (final HttpGet request : requests) {
httpclient.execute(request, new FutureCallback() {
//無論完成還是失敗都調用countDown()
@Override
public void completed(final HttpResponse response) {
latch.countDown();
System.out.println(request.getRequestLine() + "->"
+ response.getStatusLine());
}
@Override
public void failed(final Exception ex) {
latch.countDown();
System.out.println(request.getRequestLine() + "->" + ex);
}
@Override
public void cancelled() {
latch.countDown();
System.out.println(request.getRequestLine()
+ " cancelled");
}
});
}
latch.await();
System.out.println("Shutting down");
} finally {
httpclient.close();
}
System.out.println("Done");
}
}
參考文檔:http://hc.apache.org/httpcomponents-asyncclient-dev/examples.html
總結
以上是生活随笔為你收集整理的java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cookie中文乱码
- 下一篇: java string类型详解_Java