httpclient java 异步_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利用原始HttpURLConnection发送http请求数据小结

1,在post请求下,写输出应该在读取之后,否则会抛出异常. 即操作OutputStream对象应该在InputStreamReader之前. 2.conn.getResponseCode()获取返回 ...

Java利用cors实现跨域请求

由于ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告 网站开发,在某些情况下需要用到跨域. 什么是跨域? 跨域,指 ...

Android Asynchronous Http Client-Android异步网络请求客户端接口

1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...

【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)

https://www.cnblogs.com/xdp-gacl/p/4187089.html http://doc.okbase.net/yuanfy008/archive/265663.html ...

iOS 多个异步网络请求全部返回后再执行具体逻辑的方法

对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...

谈谈Java利用原始HttpURLConnection发送POST数据

这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧 URLConnectio ...

Android中的异步网络请求

本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...

Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传

Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...

第二篇:利用shell脚本执行webservice请求——基于soap

1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

随机推荐

POJ 2109

#include #include #include using namespace std; int mai ...

android模拟器经常出现的一些问题及解决办法

1.Unable to get view server version from device exlipse下编写好android应用程序时候,右键项目 run as android applica ...

sql 当重复的数据有多条时,保留一条,删除其他重复

delete from proj_info where   newcode in (select newcode    from proj_info group by newcode      hav ...

POJ-1328 Radar Installation--区间选点问题(贪心)

题目链接: https://vjudge.net/problem/POJ-1328 题目大意: 假设陆地的海岸线是一条无限延长的直线,海岛是一个个的点,现需要在海岸线上安装雷达,使整个雷达系统能够覆盖 ...

linux设备驱动模块引用和依赖

/modules/04 # lsmod test 787 0 - Live 0xbf010000 (PO) func 633 1 test, Live 0xbf00c000 (PO) test -&g ...

[MySQL] 索引中的b树索引

1.索引如果没有特别指明类型,一般是说b树索引,b树索引使用b树数据结构存储数据,实际上很多存储引擎使用的是b+树,每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历 2.底层的 ...

爬虫之requests

一.基本用法 1.GET请求 ①r=requests.get(url) --返回Response对象 def get(url, params=None, **kwargs): params={... ...

python metaclass

看了很多类似的博客,这篇算是写的比较完善的,转载以备后期查看 原文: 一 你可以从这里获取什么? 1. 也许你在阅读别人的代码的时候碰到过metaclass,那你可以参考这里的介绍. 2. 或许你需要 ...

Eclipse,以及tomcat使用时可能会遇到的几个问题

http://blog.sina.com.cn/s/blog_56b0cb2d01000a7r.html Eclipse,以及tomcat有几个问题.说明如下 1, 工程不编译的问题 . 有时候,项目 ...

s12-day04-work01 简单计算器功能实现

代码: #!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo. ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值