`
oneforce
  • 浏览: 19520 次
社区版块
存档分类
最新评论

【转载】HttpClient+ Spring实现多线程

阅读更多

HttpClient通过MultiThreadedHttpConnectionManager实现多线程通讯

HttpConnectionManagerParams设置connectionTimeout链接超时,soTimeout读取数据超时,maxTotalConnections,defaultMaxConnectionsPerHost等等参数

MultiThreadedHttpConnectionManager多线程中属性params是HttpConnectionManagerParams

Spring中xml配置文件如下

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="   
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd   
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
  
    <!-- httpclient线程池 -->  
    <bean id="connectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">  
        <property name="connectionTimeout" value="10000"/>  
        <property name="soTimeout" value="10000"/>  
        <property name="maxTotalConnections" value="30"/>  
        <property name="defaultMaxConnectionsPerHost" value="20"/>  
    </bean>    
       
    <bean id="connectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">  
        <property name="params" ref="connectionManagerParams"/>  
    </bean>  
       
    <bean id="httpclient" class="org.apache.commons.httpclient.HttpClient">  
        <constructor-arg>  
            <ref bean="connectionManager"/>  
        </constructor-arg>  
    </bean>  
       
    <bean id="httpClientUtil" class="com.chinaums.utils.HttpClientUtil">  
        <property name="httpclient" ref="httpclient"/>  
    </bean>  
       
       
</beans>  

 

package com.chinaums.utils;   
  
import java.net.InetAddress;   
import java.net.NetworkInterface;   
import java.net.SocketException;   
import java.util.Enumeration;   
import java.util.List;   
  
import javax.servlet.http.HttpServletRequest;   
  
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;   
import org.apache.commons.httpclient.HttpClient;   
import org.apache.commons.httpclient.methods.GetMethod;   
import org.apache.commons.httpclient.methods.PostMethod;   
import org.apache.commons.httpclient.params.HttpMethodParams;   
  
  
/**  
 * httpClient工具类  
 *   
 
 *   
 */  
public class HttpClientUtil {   
  
    private  HttpClient httpclient;   
  
    public void setHttpclient(HttpClient httpclient) {   
        this.httpclient = httpclient;   
    }   
  
    public HttpClientUtil() {   
  
    }   
  
    /**  
     * 以get方式发送http请求  
     *   
     * @param url  
     * @return  
     */  
    public String sendRequest(String url) {   
        GetMethod getMethod = new GetMethod(url);   
        try {   
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());   
//          httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(6000);   
//          getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,6000);   
            httpclient.executeMethod(getMethod);   
            return getMethod.getResponseBodyAsString();   
        } catch (Exception e) {   
            e.printStackTrace();   
            return "FAIL";   
        }   
        finally{   
            getMethod.releaseConnection();   
        }   
    }   
       
    /**  
     * 以get方式发送http请求  
     *   
     * @param url  
     * @return  
     */  
    public boolean isActive(String url) {   
        boolean flag = false;   
        GetMethod getMethod = new GetMethod(url);   
        try {   
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());   
            int statusCode = httpclient.executeMethod(getMethod);   
            if(statusCode==200){   
                flag = true;   
            }   
            return flag;   
        } catch (Exception e) {   
            e.printStackTrace();   
            return flag;   
        }   
        finally{   
            getMethod.releaseConnection();   
        }   
    }   
       
    /**  
     * 以post方式发送http请求  
     *   
     * @param url  
     * @return  
     */  
    public  int sendRequestAsPost(String url) {   
        PostMethod postMethod = new PostMethod(url);   
        try {   
            postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());   
            httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(1000);   
            postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,1000);   
  
            int statusCode = httpclient.executeMethod(postMethod);   
            return statusCode;   
        } catch (Exception e) {   
            e.printStackTrace();   
            return 500;   
        }   
        finally{   
            postMethod.releaseConnection();   
        }   
    }   
  
    /**  
     * 验证请求是否是本机发出  
     *   
     * @param request  
     *            true本机发出 false非本机发出  
     * @return  
     */  
    public static boolean isRequestFromSelf(HttpServletRequest request) {   
        if (getRemoteIpAddr(request).equals(getLocalIpAddr()))   
            return true;   
        else  
            return false;   
    }   
  
    /**  
     * 获取远程客户端IP地址  
     *   
     * @param request  
     * @return  
     */  
    public static String getRemoteIpAddr(HttpServletRequest request) {   
        String ip = request.getHeader("X-Forwarded-For");   
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
            ip = request.getHeader("Proxy-Client-IP");   
  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
            ip = request.getHeader("WL-Proxy-Client-IP");   
  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
            ip = request.getHeader("HTTP_CLIENT_IP");   
  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");   
  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
            ip = request.getRemoteAddr();   
  
        if ("0:0:0:0:0:0:0:1".equals(ip.trim()))   
            ip = "server";   
  
        // 判断请求是否是本机发出,如果是本机发出,那么就获取本机地址   
        if ("127.0.0.1".equals(ip) || ip.equalsIgnoreCase("localhost"))   
            ip = getLocalIpAddr();   
  
        return ip;   
    }   
  
    /**  
     * 获取本机IP地址  
     *   
     * @return  
     */  
    public static String getLocalIpAddr() {   
        try {   
            Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();   
            InetAddress ip = null;   
            String ipAddr = null;   
            while (netInterfaces.hasMoreElements()) {   
                NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();   
                ip = (InetAddress) ni.getInetAddresses().nextElement();   
                if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {   
                    ipAddr = ip.getHostAddress();   
                    break;   
                }   
            }   
            return ipAddr;   
        } catch (SocketException e) {   
            e.printStackTrace();   
            return null;   
        } catch (Exception e) {   
            e.printStackTrace();   
            return null;   
        }   
    }   
  
    /**  
     * 判断某回调地址是否是指定的网关地址  
     *   
     * @param notifyUrl  
     * @param getwayList  
     * @return true 是网关 false不是网关地址  
     */  
    public static boolean isLocalNotifyUrl(String notifyUrl, List getwayList) {   
        boolean flag = false;   
        for (Object object : getwayList) {   
            String getway = (String) object;   
            if (notifyUrl.toLowerCase().contains(getway)) {   
                flag = true;   
                break;   
            }   
        }   
        return flag;   
    }   
       
    public static void main(String[] arg){   
        HttpClient httpclient = new HttpClient();   
        String url = "http://www.163.com";   
        GetMethod method = new GetMethod(url);   
        try {   
            method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());   
            int statusCode = httpclient.executeMethod(method);   
            System.out.println(statusCode);   
            byte[] responseBody = method.getResponseBody();   
            System.out.println(new String(responseBody));   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        finally{   
            method.releaseConnection();   
        }   
       
           
    }   
}  

 

分享到:
评论

相关推荐

    HttpClient+ Spring实现多线程

    标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...

    https+spring3+httpclient4多文件上传

    对于大量文件上传,可以考虑使用异步或者多线程策略,以提高上传效率。Spring的`AsyncController`或`@Async`注解可以帮助实现异步处理。 总之,"HTTPS + Spring3 + HttpClient4 多文件上传"涉及的技术点广泛,从...

    使用java的HttpClient实现多线程并发

    为了实现多线程并发,我们需要创建一个`Runnable`任务,该任务用于执行HTTP GET请求: ```java public class GetTask implements Runnable { private final String url; public GetTask(String url) { this.url ...

    java多线程程序设计:Java NIO+多线程实现聊天室

    java多线程程序设计:Java NIO+多线程实现聊天室 Java基于多线程和NIO实现聊天室 涉及到的技术点 线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 Selector Channel ByteBuffer ProtoStuff 高...

    基于java开发的NIO+多线程实现聊天室+源码+项目解析(毕业设计&课程设计&项目开发)

    基于java开发的NIO+多线程实现聊天室+源码+项目解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 涉及到的技术点 线程池ThreadPoolExecutor 阻塞...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    5. **异步请求**:虽然HttpClient 3.0主要设计为同步模型,但通过多线程和回调机制,可以实现一定程度的异步处理。 四、示例代码 ```java import org.apache.commons.httpclient.HttpClient; import org.apache....

    多线程下载支持断点续传

    这里,我们将深入探讨这两个概念,并结合使用HttpURLConnection实现的多线程下载工具进行讲解。 首先,多线程下载是一种利用网络资源的方式,它将一个大文件分成多个部分,通过创建多个并行的网络连接,同时下载...

    Java NIO+多线程实现聊天室

    HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的...

    httpclient-4.5.3.zip

    - **线程安全**:HttpClient实例不是线程安全的,建议每个请求使用新的HttpClient实例,或者使用多线程安全的连接管理器。 5. **与其他库的集成** - HttpClient可以轻松与Spring框架集成,通过`...

    httpclient3.1 javadoc chm版

    HttpClient允许进行多线程并发请求,但需要注意线程安全问题。此外,合理设置连接超时、重试策略、连接池大小等参数也能显著提升性能。 九、与其他库的集成 HttpClient可以方便地与Spring框架、JUnit测试等结合使用...

    httpclient手册

    2. **创建HttpClient实例**:HttpClient的实例是线程安全的,可以被多个并发的请求共享。理解`HttpClientBuilder`和`CloseableHttpClient`的概念,以及如何通过它们来定制和构建HttpClient实例。 3. **发起GET和...

    最新 httpclient-4.3.3

    在实际开发中,HttpClient 4.3.3 可以与各种 Java 框架(如 Spring、Struts 等)无缝集成,简化网络调用的实现。同时,其丰富的文档和社区支持,使得开发者能够快速理解和掌握这个强大的工具。 总的来说,...

    httpClient

    10. **多线程和并发**:HttpClient支持多线程和并发请求,可以在一个HttpClient实例下并发执行多个请求,提高效率。 在实际开发中,HttpClient通常与其他库结合使用,如Jsoup解析HTML,或者Gson、Jackson等库处理...

    HttpClient 4.1.3

    11. **性能优化**:HttpClient 4.1.3版本对性能进行了优化,例如连接池的改进,以及对多线程环境的支持,使得在大量并发请求时表现更佳。 12. **错误处理**:HttpClient提供了丰富的异常处理机制,如`IOException`...

    commons-httpclient 源代码包

    7. **异步处理**:虽然`commons-httpclient`主要是基于同步模型设计的,但在某些场景下,它可以通过多线程或者回调机制实现一定程度的异步处理。 8. **自定义处理器**:为了满足特殊需求,开发者可以创建自定义的...

    HttpClient用到的jar包.rar

    此外,学习如何在多线程环境中使用HttpClient,以及如何与其他Java库(如Spring框架)集成,将有助于你更高效地实现HTTP通信。 总之,HttpClient是一个强大且灵活的工具,适用于各种Java应用的HTTP通信需求。这个...

    httpclient4.2.2.zip

    5. 异步处理:4.2.2版本支持异步执行HTTP请求,能够更好地利用多线程环境,提升程序并发能力。 二、HttpClient 4.2.2的使用步骤 1. 创建HttpClient实例:通过`HttpClientBuilder`构建器,设置必要的参数如连接池...

    HttpClient4_Tutorial_API_Doc_En+Cn.rar

    特别地,教程还讲解了如何处理重定向、认证、Cookie管理以及使用多线程进行并发请求等问题,帮助开发者更好地理解和使用HttpClient。 最后,“httpclient-tutorial.pdf”可能是另一份关于HttpClient的教程,它可能...

    基于Springboot+Jsoup实现网上免费公开图片资源爬取

    1. **并发处理**:为了提高爬取效率,可以使用多线程或异步处理来并发下载多个图片。 2. **速率控制**:为了避免对目标网站造成过大的压力,可以设置爬取速率限制。 3. **异常处理**:对可能出现的网络异常、解析...

    基于SpringBoot+HtmlClient+Jsoup实现java爬取网易云音乐.zip

    此外,为了提高爬虫的效率和稳定性,可以采用多线程、分布式爬虫技术,或者利用Scrapy这样的高级爬虫框架。同时,对于动态加载的内容,可能还需要结合Selenium等工具来模拟用户交互。 总之,这个项目涉及了...

Global site tag (gtag.js) - Google Analytics