java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient進(jìn)行異步HTTP請(qǐng)求
前段時(shí)間有個(gè)需求在springmvc mapping的url跳轉(zhuǎn)前完成一個(gè)統(tǒng)計(jì)的業(yè)務(wù)。顯然需要進(jìn)行異步的處理,不然出錯(cuò)或者異常會(huì)影響到后面的網(wǎng)頁跳轉(zhuǎn)。異步的方式也就是非阻塞式的,當(dāng)異步調(diào)用成功與否程序會(huì)接著往下執(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只請(qǐng)求一個(gè) url異步請(qǐng)求。Future接口表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并獲取計(jì)算的結(jié)果。計(jì)算完成后只能使用 get 方法來獲取結(jié)果,如有必要,計(jì)算完成前可以阻塞此方法。取消則由 cancel 方法來執(zhí)行。還提供了其他方法,以確定任務(wù)是正常完成還是被取消了。一旦計(jì)算完成,就不能再取消計(jì)算。如果為了可取消性而使用 Future 但又不提供可用的結(jié)果,則可以聲明 Future> 形式類型、并返回 null 作為底層任務(wù)的結(jié)果。
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();// 默認(rèn)的配置
try {
httpclient.start();
HttpGet request = new HttpGet("http://www.apache.org/");
Future future = httpclient.execute(request, null);
HttpResponse response = future.get();// 獲取結(jié)果
System.out.println("Response: " + response.getStatusLine());
System.out.println("Shutting down");
} finally {
httpclient.close();
}
System.out.println("Done");
}
}
同步器(Synchronizer)是一些使線程能夠等待另一個(gè)線程的對(duì)象,允許它們協(xié)作,最常用的同步器是CountDownLatch和
Semaphore。較不常用的是CyclicBarrier和Exchanger。Semaphore類是一個(gè)計(jì)數(shù)信號(hào)量。從概念上講,信號(hào)量維護(hù)了一
個(gè)許可集。如有必要,在許可可用前會(huì)阻塞每一個(gè) acquire(),然后再獲取該許可。每個(gè) release()
添加一個(gè)許可,從而可能釋放一個(gè)正在阻塞的獲取者。但是,不使用實(shí)際的許可對(duì)象,Semaphore 只對(duì)可用許可的號(hào)碼進(jìn)行計(jì)數(shù),并采取相應(yīng)的行動(dòng)。
CountDownLatch是一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。用給定的計(jì)數(shù) 初始化
CountDownLatch。由于調(diào)用了 countDown() 方法,所以在當(dāng)前計(jì)數(shù)到達(dá)零之前,await
方法會(huì)一直受阻塞。之后,會(huì)釋放所有等待的線程,await
的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次——計(jì)數(shù)無法被重置。如果需要重置計(jì)數(shù),可使用
CyclicBarrier。倒計(jì)數(shù)索存器(CountDownLatch)是一次性的障礙。它的唯一構(gòu)造器帶有一個(gè)int類型的參數(shù),這個(gè)參數(shù)是指允許
所有的等待線程處理之前,必須在鎖存器上調(diào)用countDown()方法的次數(shù)。這一點(diǎn)非常有用。下面是異步請(qǐng)求一組url的例子,利用callback
借口完成獨(dú)立的操作。
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() {
//無論完成還是失敗都調(diào)用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
總結(jié)
以上是生活随笔為你收集整理的java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cookie中文乱码
- 下一篇: java string类型详解_Java