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请求相关推荐

  1. java https post get请求_JAVA利用HttpClient进行POST和GET请求(HTTPS)

    目前,要为另一个项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用JQuery post进行请求. 但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而JQuery的p ...

  2. java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. TCP协议概念 先来了解一下TCP协议 ...

  3. java socket 聊天室_java利用Socket实现聊天室功能实例

    导读热词 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.p ...

  4. java spring怎么运行_java – 如何使用spring异步运行方法?

    下面的代码假设是异步工作,而是等待Async部分完成然后继续.如何使blah()方法异步运行? xmlns="http://www.springframework.org/schema/be ...

  5. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...

  6. java 特殊符号正则_java利用正则表达式处理特殊字符的方法实例

    前言 一串字符串中有特殊符号,可能会影响到相关接口业务,所以需要把字符串中的特殊字符都过滤掉 百度上面搜索大部分处理方法是通过正则表达式, 他需要处理的特殊符号都写进正则表达式中去校验, 这种方式一眼 ...

  7. java 屏蔽地域性访问_javaweb利用filter拦截未授权请求

    项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: public class SecurityFilter imple ...

  8. java多核的利用率_java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算

    java利用FutureTask.ExecutorService 在多核时代充分利用CPU运算 FutureTask.ExecutorService 相关知识,请看java,API 一个使用Futur ...

  9. java代码中 作用_Java利用开发中代码生成工具的作用

    Java利用开发中代码生成工具的作用 2010-6-5文字大小:大中小 近来,随着各种代码生成工具的不断涌现(如SpringSource的Spring Roo.Skyway Builder Commu ...

最新文章

  1. EditText中的几个常用属性
  2. 6个趣味项目,带你看看普通开发者如何玩转AI
  3. Acunetix WVS安全测试软件使用教程(入门级)
  4. 中国公有云三巨头,同时支持Rancher Kubernetes平台
  5. Windows编程---------MessageBox
  6. svn 提交到远程仓库_聊聊如何从SVN迁移源码到Git仓库
  7. HDU - 6635 Nonsense Time (暴力LIS)
  8. 从源文件和JAR文件构建Java代码模型
  9. mysql 手动配置服务器_Win7系统下手动配置Apache+PHP+MySQL环境WEB服务器 -电脑资料...
  10. 批量生成10个虚拟主机配置
  11. python工程师工资多少-Python全栈工程师为何这么火薪资这么高看了才知道
  12. 期许伟大-基于CMMI的过程改进之道探索
  13. WebForms简介
  14. mysql最简单的查看_查看Mysql版本号 (最简单的是status )
  15. 【Webcam设计】x264对OpenCV Mat的编解码
  16. 微信小程序-rpx尺寸介绍
  17. react视频教程经典大全
  18. 微信小程序uniapp实现小图标转成SVN代码
  19. 关于antd中嵌套表格expandable属性如何设置为可变化的
  20. 【好题分享】适合c++初学者(从易到难)

热门文章

  1. 跨进程实现在Tree中快速定位节点
  2. BAT网页10年巨变,背后的前端技术你都知道吗?
  3. python3urllib常见使用_Python3 urllib常用操作
  4. java实现磁盘分配显示_Java实现窗体动态加载磁盘文件
  5. 图片也要查重了?期刊用AI审论文防造假,旋转/翻转/拉伸都不行
  6. 饶毅教授对非升即走的思考
  7. NBT:你想成为计算生物学家?
  8. 线性代数、概率 入门书籍推荐
  9. ios12关闭设置角标_iOS 12.4.2为停产的设备带来了安全修复程序
  10. 信息安全工程师笔记-案例分析(四)