• 使用PoolingHttpClientConnectionManager解决友盟(umeng)推送在多线程环境推送失败的问题


    在友盟(umeng)提供的服务端推送的sdk中,使用的是apache提供的httpclient。在单线程化境下,httpclient工作没有问题。但是由于umeng的sdk中并未考虑并发的情况,因此很有可能你会收到这样的error:

    java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
    Make sure to release the connection before allocating another one.

    在apache提供的httpclient类库中,其实已经提供了对线程池管理的类,比如PoolingHttpClientConnectionManager:

    修改umeng sdk中的PushClient.java:

    1.由于默认的HttpClient(4.3.5)构造函数已经过期,可以使用下面的方式重新声明:

    protected HttpClient client = HttpClients.custom().build();

    2. 增加一个PushClient的构造函数:

    public PushClient() {

    ConnectionSocketFactory plainsf = PlainConnectionSocketFactory
    .getSocketFactory();
    LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory
    .getSocketFactory();
    Registry<ConnectionSocketFactory> registry = RegistryBuilder
    .<ConnectionSocketFactory>create().register("http", plainsf)
    .register("https", sslsf).build();
    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
    registry);
    // 将最大连接数增加
    cm.setMaxTotal(20);
    // 将每个路由基础的连接增加
    cm.setDefaultMaxPerRoute(20);

    client = HttpClients.custom()
    .setConnectionManager(cm).build();
    }

    完成。

    顺便提一下,我不是使用umeng的maven jar包,是使用他们的源代码做集成的。源代码版本的sdk请参看下面的参考联接。

     参考:

    HttpClient Examples:http://hc.apache.org/httpcomponents-client-ga/examples.html

    umeng sdk集成:http://dev.umeng.com/push/ios/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%BB%A3%E7%A0%81%E8%B0%83%E7%94%A8%E7%A4%BA%E4%BE%8B

  • 相关阅读:
    PHP7中php.ini、php-fpm和www.conf的配置(转)
    Linux下查看nginx、mysql、php的安装路径和编译参数
    Skip List(跳跃表)原理详解与实现【转】
    offset宏的讲解【转】
    Linux内核中的常用宏container_of其实很简单【转】
    Linux内核同步原语之原子操作【转】
    创建与合并分支【转】
    Git远程操作详解【转】
    【项目管理】git和码云的使用【转】
    Git和Github简单教程【转】
  • 原文地址:https://www.cnblogs.com/liszt/p/umeng-sdk-with-mutiple-threads.html
Copyright © 2020-2023  润新知