我们有一个groovy单例,使用PoolingHttpClientConnectionManager(httpclient:4.3.6),池大小为200,以处理与搜索服务非常高的并发连接并处理xml响应.

尽管已经指定了超时,但它每个月冻结约一次,但在其余时间内运行良好.

下面的groovy单身.方法retrieveInputFromURL似乎阻止在client.execute(get);

@Singleton(strict=false)

class StreamManagerUtil {

// Instantiate once and cache for lifetime of Signleton class

private static PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

private static CloseableHttpClient client;

private static final IdleConnectionMonitorThread staleMonitor = new IdleConnectionMonitorThread(connManager);

private int warningLimit;

private int readTimeout;

private int connectionTimeout;

private int connectionFetchTimeout;

private int poolSize;

private int routeSize;

PropertyManager propertyManager = PropertyManagerFactory.getInstance().getPropertyManager("sebe.properties")

StreamManagerUtil() {

// Initialize all instance variables in singleton from properties file

readTimeout = 6

connectionTimeout = 6

connectionFetchTimeout =6

// Pooling

poolSize = 200

routeSize = 50

// Connection pool size and number of routes to cache

connManager.setMaxTotal(poolSize);

connManager.setDefaultMaxPerRoute(routeSize);

// ConnectTimeout : time to establish connection with GSA

// ConnectionRequestTimeout : time to get connection from pool

// SocketTimeout : waiting for packets form GSA

RequestConfig config = RequestConfig.custom()

.setConnectTimeout(connectionTimeout * 1000)

.setConnectionRequestTimeout(connectionFetchTimeout * 1000)

.setSocketTimeout(readTimeout * 1000).build();

// Keep alive for 5 seconds if server does not have keep alive header

ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {

@Override

public long getKeepAliveDuration(HttpResponse response, HttpContext context) {

HeaderElementIterator it = new BasicHeaderElementIterator

(response.headerIterator(HTTP.CONN_KEEP_ALIVE));

while (it.hasNext()) {

HeaderElement he = it.nextElement();

String param = he.getName();

String value = he.getValue();

if (value != null && param.equalsIgnoreCase

("timeout")) {

return Long.parseLong(value) * 1000;

}

}

return 5 * 1000;

}

};

// Close all connection older than 5 seconds. Run as separate thread.

staleMonitor.start();

staleMonitor.join(1000);

client = HttpClients.custom().setDefaultRequestConfig(config).setKeepAliveStrategy(myStrategy).setConnectionManager(connManager).build();

}

private retrieveInputFromURL (String categoryUrl, String xForwFor, boolean isXml) throws Exception {

URL url = new URL( categoryUrl );

GPathResult searchResponse = null

InputStream inputStream = null

HttpResponse response;

HttpGet get;

try {

long startTime = System.nanoTime();

get = new HttpGet(categoryUrl);

response = client.execute(get);

int resCode = response.getStatusLine().getStatusCode();

if (xForwFor != null) {

get.setHeader("X-Forwarded-For", xForwFor)

}

if (resCode == HttpStatus.SC_OK) {

if (isXml) {

extractXmlString(response)

} else {

StringBuffer buffer = buildStringFromResponse(response)

return buffer.toString();

}

}

}

catch (Exception e)

{

throw e;

}

finally {

// Release connection back to pool

if (response != null) {

EntityUtils.consume(response.getEntity());

}

}

}

private extractXmlString(HttpResponse response) {

InputStream inputStream = response.getEntity().getContent()

XmlSlurper slurper = new XmlSlurper()

slurper.setFeature("http://xml.org/sax/features/validation", false)

slurper.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)

slurper.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false)

slurper.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)

return slurper.parse(inputStream)

}

private StringBuffer buildStringFromResponse(HttpResponse response) {

StringBuffer buffer= new StringBuffer();

BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

String line = "";

while ((line = rd.readLine()) != null) {

buffer.append(line);

System.out.println(line);

}

return buffer

}

public class IdleConnectionMonitorThread extends Thread {

private final HttpClientConnectionManager connMgr;

private volatile boolean shutdown;

public IdleConnectionMonitorThread

(PoolingHttpClientConnectionManager connMgr) {

super();

this.connMgr = connMgr;

}

@Override

public void run() {

try {

while (!shutdown) {

synchronized (this) {

wait(5000);

connMgr.closeExpiredConnections();

connMgr.closeIdleConnections(10, TimeUnit.SECONDS);

}

}

} catch (InterruptedException ex) {

// Ignore

}

}

public void shutdown() {

shutdown = true;

synchronized (this) {

notifyAll();

}

}

}

我还发现在日志中发现这一点,导致我相信它在等待响应数据时发生

java.net.SocketTimeoutException:通过java.net.SocketInputStream.read(SocketInputStream.java:150)在java.net.SocketInputStream.read(SocketInputStream.java:121)上的java.net.SocketInputStream.socketRead0(Native Method)读取超时)在sun.security.ssl.InputRecord.readFully(InputRecord.java:465)

到目前为止的调查结果:

问题

>这可能是同步问题吗?从我的理解,即使单线程被多个线程访问,唯一的共享数据是缓存的CloseableHttpClient

>这个代码有什么其他根本的错误,可能导致这种行为的方法?

java httpclient单例_java-8 – CloseableHttpClient.execute每隔几周就会冻结一次,尽管超时...相关推荐

  1. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

  2. java 窗口 单例_java单例模式实现面板切换

    本文实例为大家分享了java单例模式实现面板切换的具体代码,供大家参考,具体内容如下 1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public c ...

  3. redis java api 单例_Java API 操作Redis

    针对Redis的Java客户端有很多种,具体查看官网信息:https://redis.io/clients#java 本次测试使用Jedis API,Jedis使用方便,其api方法名称与redis命 ...

  4. java connection 单例_Java设计模式之单例模式详解

    Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...

  5. java设计模式 单例_java设计模式--单例模式

    单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...

  6. java 构造函数 单例_Java中的私有构造函数和单例类 - Break易站

    Java 构造函数 Java中的私有构造函数和单例类 我们首先分析下面的问题: 我们可以有私人构造函数吗? 正如你可以很容易猜到的,就像我们可以为构造函数提供访问说明符一样.如果它是私人的,那么它只能 ...

  7. java 内部类 单例_Java单例模式的几种实现

    一:静态内部类实现单例模式 原理:通过一个静态内部类定义一个静态变量来持有当前类实例,在类加载时就创建好,在使用时获取. 缺点:无法做到延迟创建对象,在类加载时进行创建会导致初始化时间变长. publ ...

  8. java 工厂 单例_java 单例模式和工厂模式实例详解

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class ...

  9. java 变量单例_Java静态变量的用法:伪单例

    这几天遇到一个问题,一个Service里有一个map,但是这个Service有别的继承,于是每一个Service都会创建一个map,但是这个map应该是公用的,于是就有问题了...(按结构说Servi ...

最新文章

  1. MySQL的MVCC机制是什么?
  2. 【资源干货】港中文《深度学习导论》2021课件,李鴻升老师讲授
  3. React篇-报错信息:warning: Can't call setState (or forceUpdate) on an unmounted component.
  4. mysql中OPTIMIZE TABLE的作用
  5. starUML--面向对象的设计过程
  6. 机器学习(二十五)——强化学习(2)
  7. c#之task与thread区别及其使用
  8. 学习Python的好去处,微信公众号“Python小屋”
  9. NHibernate 操作视图 第十三篇
  10. 学习swift从青铜到王者之Swift控制语句04
  11. UVA 12299 - RMQ with Shifts 线段树
  12. vijos 1752
  13. linux系统下查看本机所在局域网中所有设备IP
  14. Idea插件开发-开发自己的第一款idea插件
  15. QThread的用法
  16. c语言scanf不用取地址符,关于c中printf和scanf函数是否使用取地址符的疑问
  17. salt returner mysql_saltstack mysql returner
  18. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形
  19. PDPS软件:机器人焊枪工具自动选取功能介绍与使用方法
  20. 利用ELK技术栈收集nginx日志

热门文章

  1. pix2pix 学习笔记
  2. TensorFlow学习笔记(十九) 基本算术运算和Reduction归约计算
  3. 万用socket神器Linux Netcat 命令
  4. 9.03-Springboot要点记录
  5. Wyn Enterprise 核心功能:系统集成
  6. Scala 函数式编程_部分应用函数_Partially Applied Functions
  7. linux svn 常用命令
  8. 网站被写入恶意代码的主要原因及防范策略
  9. [小改进]在个人Blog页面显示文章阅读数
  10. 6/7 SELECT语句:过滤(正则表达式REGEXP)