日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求

發(fā)布時(shí)間:2025/3/15 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。