默认情况下(即用默认构造方法建立HttpClient对象),httpMethod.releaseConnection()方法并不会关闭连接的Socket,目的是可以重用这个连接。网上有不少讨论:
这些讨论里提出了关闭Socket的方法,即在请求头里加上”Connection: close”,具体可见HTTP协议规范里的说明。
其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象,来保证关闭Socket连接:
- HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));
具体可见HttpClient源码和API文档。
当然,使用HttpClient的多线程连接管理器时就不用这么做了。
Related posts
今天下午,线上的Jetty服务宕机了,日志里大量的”java.io.IOException: Too many open files”错误。搜索到Freddy Chu的博客里正好有关于此的解决办法。
$ sysctl fs.file-max
$ lsof -u jetty -nn | wc -l
$ ulimit -a
$ sudo vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
同时发现了系统里也有Freddy Chu提到的”Too many CLOSE_WAIT”问题,谢谢Freddy Chu。
$ sudo vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 2
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 1800
$ sudo sysctl -p
Update(2010-01-21): root用户要特殊设置
$ sudo vi /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
Related posts
使用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
借助iText和Adobe Acrobat的Javascript支持,可以实现PDF文档的自动打印(可以做到不显示打印对话框)
- ......
-
- PdfReader reader = new PdfReader(pdfStream); [1]
-
- StringBuffer script = new StringBuffer(); [2]
- script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});")
- .append("\r\nthis.closeDoc();");
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream(pdfStream.length);
- try {
- PdfStamper stamp = new PdfStamper(reader, bos); [3]
- stamp.setViewerPreferences(PdfWriter.HideMenubar
- | PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
- stamp.addJavaScript(script.toString());
- stamp.close();
- } catch (DocumentException e) {
- logger.error(e.getMessage(), e.getCause());
- }
-
- return new StreamingResolution("application/pdf",
- new BufferedInputStream(new ByteArrayInputStream(bos.toByteArray()))) ;
-
- ......
代码说明:
1、pdfStream是用iText生成的PDF文档字节流
2、script是要加入到PDF文档里的Javascript代码。这段Javascript代码先调用PDF文档对象的print方法,然后用closeDoc方法关闭文档。print方法的参数指定了不要显示打印对话框,参数含义参考Acrobat JavaScript Scripting Reference
3、bos用来保存加入Javascript后的PDF文档字节流,它作为PdfStamper对象的输出流。PdfStamper对象调用addJavaScript方法将Javascript代码加入到PDF文档中。
Web页面嵌入PDF文档:
- <embed type="application/pdf" src="/PrintPdf.action" width="1" height="1"></embed>
Related posts
Published on
2 years, 9 months ago in
Dev.
Tags: Java, maven.
使用Artifactiry为自己的开发团队设立了repository镜像。有时需要把本地的一些第三方的jar包发布到服务器,使用maven-deploy-plugin的deploy:deploy-file目标可以完成这个任务。
比如,要发布jta的jar包jta-1.0.1B.jar
$ mvn deploy:deploy-file -DgroupId=javax.transaction \
-DartifactId=jta \
-Dversion=1.0.1B \
-Dpackaging=jar \
-Dfile=~/.m2/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar \
-DrepositoryId=central \
-Durl=http://host.of.your.repository[:port]/artifactory/ibiblio@repo
说明:
- repositoryId在工程的pom文件里设置
- url由Artifactiry的配置决定,注意不能使用virtual repository的地址
- 如果远程repository需要身份验证,用户名和密码需要在maven的settings.xml里设置
参考:
Related posts
Recent Comments