Archive for the 'Dev' Category

再谈使用Commons HttpClient产生大量CLOSE_WAIT

默认情况下(即用默认构造方法建立HttpClient对象),httpMethod.releaseConnection()方法并不会关闭连接的Socket,目的是可以重用这个连接。网上有不少讨论:

这些讨论里提出了关闭Socket的方法,即在请求头里加上”Connection: close”,具体可见HTTP协议规范里的说明

其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象,来保证关闭Socket连接:

  1. HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));

具体可见HttpClient源码和API文档。

当然,使用HttpClient的多线程连接管理器时就不用这么做了。

Related posts

再次遭遇大量CLOSE_WAIT

今天下午线上的Jetty服务又停止响应了。不过与上次不同的是,日志里没有Too many open files的问题(看来ulimit设置管用了),看不出任何问题。于是用netstat检查网络连接,发现了大量CLOSE_WAIT状态的连接,而且都是连接到同一个IP地址。联想到程序里有调用外部网站服务的部分,检查这个IP,正是其中的一个服务。检查代码,发现开发人员使用Commons HttpClient时出了问题,居然忘记关闭连接了(method.releaseConnection();)!!后果就是对方关闭了连接,连接不断地变成CLOSE_WAIT状态,直到耗尽所有的网络资源,没法再建立连接了。

从这个教训看出,项目的研发管理真是没有到位啊!快速反复的需求、几乎可以忽略的设计、缺少代码走查、没有单元测试,怎能保证上线前发现这样的问题!

Related posts

maven-eclipse-plugin v2.6与aspectj

最近一段时间以来,项目中使用maven-eclipse-plugin的eclipse:eclipse目标时比较恼人。pom里已经加入了aspectj的依赖,但生成的.classpath里却没有相应的classpathentry。

今天google到了解决办法,有两个:

1. 强制使用上个版本的maven-eclipse-plugin

<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-eclipse-plugin</artifactId>
 
<version>2.5.1</version>
</plugin>

2. 设置ajdtVersion为none

<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-eclipse-plugin</artifactId>
 
<configuration>
    
<ajdtVersion>none</ajdtVersion>
 
</configuration>             
</plugin>

Related posts

BugFree与SVN整合脚本修改

目前团队里使用subversion做版本控制,bugfree做缺陷管理。参照官方的做法实现了bugfree和svn的整合。

我为每个项目都设置了单独的svn仓库,这样在用viewvc浏览版本库时要指定root查询参数才能访问每个项目的代码库。因此我修改了bugfree官方提供的钩子脚本和向bugfree提交svn信息的php脚本,加入了对root查询参数的支持。具体改动见附件

另外,为了维护方便,我在每个项目的hooks目录里做一个到钩子脚本的软链接,这样就只需维护一个钩子脚本文件了。

Related posts

解决Maven Jetty Plugin在Windows下的“文件锁定”问题

使用Maven进行Java的web开发,Jetty Plugin是必不可缺的插件,可以极大的提到开发效率。但在Windows环境下会遇到静态文件(html、css、js)被锁定、无法即时更新的问题。要想更新这些文件,只能先停掉Jetty,保存修改,再启动Jetty,非常不方便。
解决办法是这样的:
1、从jetty.jar中解出webdefault.xml(位于org.mortbay.jetty.webapp包下)这个文件,把这个useFileMappedBuffer参数设为false

<init-param>
 <param-name>useFileMappedBuffer</param-name>
 <!-- change to false -->
 <param-value>true</param-value>
</init-param>

2、把修改后的webdefault.xml文件跟pom.xml放在一起
3、修改pom.xml里的Jetty Plugin的配置,加入webdefault.xml

...
<plugin>
   <groupId>org.mortbay.jetty</groupId>
   <artifactId>maven-jetty-plugin</artifactId>
   <version>6.1.7</version>
   <configuration>
     <contextPath>/</contextPath>
     <webDefaultXml>webdefault.xml</webDefaultXml>
     ...
    </configuration>
    ...
</plugin>
...

Related posts




This work by wolfg is licensed under a Attribution-Noncommercial-Share Alike 2.5 China Mainland.