java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient進行異步HTTP請求
前段時間有個需求在springmvc mapping的url跳轉前完成一個統(tǒng)計的業(yè)務。顯然需要進行異步的處理,不然出錯或者異常會影響到后面的網(wǎng)頁跳轉。異步的方式也就是非阻塞式的,當異步調用成功與否程序會接著往下執(zhí)行,不必等到輸入輸出處理完畢才返回。
主要用到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,并發(fā)集合(Concurrent Collection),以及同步器(Synchronizer)。下面的例子是利用java.util.concurrent.Future只請求一個 url異步請求。Future接口表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并獲取計算的結果。計算完成后只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執(zhí)行。還提供了其他方法,以確定任務是正常完成還是被取消了。一旦計算完成,就不能再取消計算。如果為了可取消性而使用 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)是一些使線程能夠等待另一個線程的對象,允許它們協(xié)作,最常用的同步器是CountDownLatch和
Semaphore。較不常用的是CyclicBarrier和Exchanger。Semaphore類是一個計數(shù)信號量。從概念上講,信號量維護了一
個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release()
添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數(shù),并采取相應的行動。
CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。用給定的計數(shù) 初始化
CountDownLatch。由于調用了 countDown() 方法,所以在當前計數(shù)到達零之前,await
方法會一直受阻塞。之后,會釋放所有等待的線程,await
的所有后續(xù)調用都將立即返回。這種現(xiàn)象只出現(xiàn)一次——計數(shù)無法被重置。如果需要重置計數(shù),可使用
CyclicBarrier。倒計數(shù)索存器(CountDownLatch)是一次性的障礙。它的唯一構造器帶有一個int類型的參數(shù),這個參數(shù)是指允許
所有的等待線程處理之前,必須在鎖存器上調用countDown()方法的次數(shù)。這一點非常有用。下面是異步請求一組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请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cookie中文乱码
- 下一篇: java自学路线图_JAVA自学路线图