zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    HTML中的target(_self,_blank)用法总结
    实用且不花哨的js代码大全
    C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
    ASP.NET操作EXCEL
    sql分页存储过程(汇总)
    Jquery plugin(多文件上传)
    使用 Anthem.NET 的常见回调(Callback)处理方式小结
    NET开发人员必知的八个网站
    用jQuery合并表格中相同文本的相邻单元格(一)
    Sigma Grid(纯javascript开发的Ajax数据表格,超级强大)
  • 原文地址:https://www.cnblogs.com/liszt/p/umeng-sdk-with-mutiple-threads.html
Copyright © 2011-2022 走看看