使用PoolingHttpClientConnectionManager解决友盟(umeng)推送在多线程环境推送失败的问题
2018-01-12 17:49
1056 查看
在友盟(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的构造函数:
参考:
HttpClient Examples:http://hc.apache.org/httpcomponents-client-ga/examples.html
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(); } 完成。
参考:
HttpClient Examples:http://hc.apache.org/httpcomponents-client-ga/examples.html
相关文章推荐
- 解决Andriod使用HttpURLConnection 失败问题
- 使用HttpClient4.5 PoolingHttpClientConnectionManager 提交Http请求
- 使用HttpClient的PoolingHttpClientConnectionManager实现Http请求连接池
- 【Android开发那点破事】解决Andriod使用HttpURLConnection 失败问题
- poolingHttpclientConnectionmanager 使用
- 解决Andriod使用HttpURLConnection 失败问题
- 使用Apache 的 FTP Client获取FTP服务器上的文件列表FTP response 421 received.Server closed connection问题的解决
- 【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)
- Http请求连接池 - HttpClient 的 PoolingHttpClientConnectionManager
- Android项目中sdk 23无法使用HttpGet 和HttpClient的问题解决--只需改一行
- 关于JAVA httpclient connection reset的问题分析和解决
- 在多线程环境下使用HttpWebRequest或者调用Web Service(连接报超时问题)
- httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
- httpclient线程池,poolinghttpclientconnectionmanager
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- Http请求连接池 - HttpClient 的 PoolingHttpClientConnectionManager
- 由Volley使用HttpURLConnection请求所引起的问题的解决过程
- HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关
- 【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)