﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava--随笔分类-应用服务器</title><link>http://www.blogjava.net/leekiang/category/24431.html</link><description>MDA/MDD/TDD/DDD/DDDDDDD</description><language>zh-cn</language><lastBuildDate>Fri, 13 Jul 2012 17:32:54 GMT</lastBuildDate><pubDate>Fri, 13 Jul 2012 17:32:54 GMT</pubDate><ttl>60</ttl><item><title>线上解决Resin服务响应过慢的几个方法(转)</title><link>http://www.blogjava.net/leekiang/archive/2012/07/13/383026.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 13 Jul 2012 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2012/07/13/383026.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/383026.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2012/07/13/383026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/383026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/383026.html</trackback:ping><description><![CDATA[最近Web服务访问量过大，由于服务器配置比较差，数量也较少，导致服务响应过慢。为了优化服务和提高响应，下面总结出几条查询Resin问题的方法。<br /><div><p><b>1、查看服务器网络状态TIME_WAIT的数量。</b></p><p><span style="color: rgb(255, 0, 0);">#netstat -antp|grep -i time_wait|wc -l</span>查看TIME_WAIT数量，如果数量过多，并且Resin前端还有Nginx或者Apache，那么请把socket-timeout、keepalive-max和把keepalive-timeout调小</p><p>      &lt;socket-timeout&gt;30s&lt;/socket-timeout&gt;<br />
      &lt;keepalive-max&gt;512&lt;/keepalive-max&gt;<br />
      &lt;keepalive-timeout&gt;60s&lt;/keepalive-timeout&gt;</p><p><b>2、查看JVM中对象占用内存情况</b><br /><br />
jmap 能查看jvm内存中，对象占用内存的情况，还提供非常方便的命令将jvm的内存信息导出的文件。<br /><br /><span style="color: rgb(255, 0, 0);">#jmap -dump:format=b,file=heap.bin &lt;pid&gt;  </span><br /><br />
命令jhat 能够解析 java内存堆的文件，生成相关信息，并启动webServer提供查询。 也就说，我们可以通过浏览器来看这些内存信息。jhat还提供了一个类sql的查询语言---OQL来给我们使用。<br /><br /><span style="color: rgb(255, 0, 0);">#jhat -J-Xmx512m heap.bin     </span><br /><br />
就可以将我们刚刚使用jmap导出的内存信息交给jhat解析了。默认的情况下，它会监听7000端口。我在本机的地址就是，http://localhost:7000/。<br />
访问http://localhost:7000/histo/，大致可以看到一下的画面，这里列出对象，对象实例数量、总占用内存大小。点击进去之后可以看到“谁引用了这个对象，这个对象又引用了哪个”这些信息。不过因为展示的信息非常多，并没有想象中那样清晰可见。<br /><br /><b>3、dump获取java stack和native stack信息</b></p><p>消息队列会突然堵塞，查看消费者日志，发现处理延时明显延长，而此时网络无丢包。最后多方排查，是java消费者运行出现死锁。<br />
这种问题可以通过jstack来dump获取java stack和native stack信息查明问题。</p><p><span style="color: rgb(255, 0, 0);">#jstatck &lt;pid&gt;</span></p></div><br /><img src ="http://www.blogjava.net/leekiang/aggbug/383026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2012-07-13 15:48 <a href="http://www.blogjava.net/leekiang/archive/2012/07/13/383026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat5中include jsp后输出的网页出现乱码的解决办法（转）</title><link>http://www.blogjava.net/leekiang/archive/2012/03/03/371182.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 03 Mar 2012 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2012/03/03/371182.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/371182.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2012/03/03/371182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/371182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/371182.html</trackback:ping><description><![CDATA[
转自 <a target="_blank" href="https://forums.oracle.com/forums/thread.jspa?threadID=914650&amp;start=0&amp;tstart=0"><span class="jive-subject">一个BUG的快速解决方法.希望能给大家的一些启示</span></a><br />朋友打来电话,他们公司新装了TOMCAT5,然后在编译JSP时,被INCLUDE的JSP都出现了问题.就是编译后被INCLUDE的地方多了两个"??"而其它正常,而如果手工把被INCLUDE的内容COPY上去测没有问题.<br />
他们的工程师都不知道是什么问题,因为周一要发布出去,所以非常着急.<br /><br />
我不知道大家听到这种情况会如何,我知道大多数人比我聪明,你肯定想到了,所以你没有必要再看了.我下面的内容只是对没有想到的人而言.<br /><br />
其实他电话还没打完 ,我就知道问题99%是他的jsp在编辑的时候是存为UTF-8而不是ANSI格式,否则没有道理出现这种问题,事实正是如此,我让他用UE打开看看果然前面多了几个UTF字符.<br /><p>
重要的是TOMCAT这种容器竟然有这样的BUG,不能正确读取UTF-8格式的文件,你总不能强求用户编辑JSP文件时一定要存为什么格式吧?<br />
费话少说,下载tomcat5的src,进入jakarta-tomcat-jasper\jasper2\src\share\org\apache\jasper\compiler,找到JspUtil.java,找到<br />
    public static InputStream getInputStream(String fname, JarFile jarFile,<br />
					     JspCompilationContext ctxt,<br />
					     ErrorDispatcher err)<br />
		throws JasperException, IOException {<br /><br />
        InputStream in = null;<br /><br />
	if (jarFile != null) {<br />
	    String jarEntryName = fname.substring(1, fname.length());<br />
	    ZipEntry jarEntry = jarFile.getEntry(jarEntryName);<br />
	    if (jarEntry == null) {<br />
		err.jspError("jsp.error.file.not.found", fname);<br />
	    }<br />
	    in = jarFile.getInputStream(jarEntry);<br />
	} else {<br />
	    in = ctxt.getResourceAsStream(fname);<br />
	}<br /><br />
	if (in == null) {<br />
	    err.jspError("jsp.error.file.not.found", fname);<br />
	}<br />
	return in;<br />
    }<br /><br />
在return in前加上判断,改成:<br />
    public static InputStream getInputStream(String fname, JarFile jarFile,<br />
					     JspCompilationContext ctxt,<br />
					     ErrorDispatcher err)<br />
		throws JasperException, IOException {<br /><br />
        InputStream in = null;<br /><br />
	if (jarFile != null) {<br />
	    String jarEntryName = fname.substring(1, fname.length());<br />
	    ZipEntry jarEntry = jarFile.getEntry(jarEntryName);<br />
	    if (jarEntry == null) {<br />
		err.jspError("jsp.error.file.not.found", fname);<br />
	    }<br />
	    in = jarFile.getInputStream(jarEntry);<br />
	} else {<br />
	    in = ctxt.getResourceAsStream(fname);<br />
	}<br /><br />
	if (in == null) {<br />
	    err.jspError("jsp.error.file.not.found", fname);<br />
	}<br />
	PushbackInputStream testin = new PushbackInputStream(in); <br />
	int ch = testin.read();<br />
	if (ch != 0xef) {<br />
		testin.unread(ch);<br />
    } <br />
    else if ((ch = testin.read()) != 0xbb) {<br />
	  testin.unread(ch);<br />
	  testin.unread(0xef);<br />
    } <br />
    else if ((ch = testin.read()) != 0xbf) {<br />
      throw new IOException("错误的UTF-8格式文件");<br />
    } <br />
    else{<br />
      //fStream.setEncoding("UTF-8");<br />
         testin.read();<br />
    }<br />
	return testin;<br />
    }<br /><br />
编译,重新打包,替换原来的包,运行TOMCAT,OK!<br /></p><p>
整个问题解决除了远程登录他的服务器传送文件的时间,总共只有4-5分钟.其实只要问题定位准确,就不难解决了.我一再强调的是经熟悉底层,你如果知道内
存中每个byte从哪儿来要到哪儿去,就可以非常容易地解决问题.在此之前我连TOMCAT5下载都没有下过,更别说试用了.但只要你对JDK有深入的了
解,就可以准确地定位问题的所在.<br /><br />
希望本文能给不是高手的朋友一点帮助和启发,对于高手的朋友你可以弃之一笑.</p><a target="_blank" href="https://forums.oracle.com/forums/thread.jspa?threadID=914650&amp;start=0&amp;tstart=0"><span class="jive-subject"></span></a><br /><a href="http://blog.csdn.net/thimin/article/details/1724393">UTF-8文件的Unicode签名BOM(Byte Order Mark)问题</a><br /><a href="http://ytuwlg.iteye.com/blog/261357">utf-8编码include页面空格</a><br /><a href="http://blog.csdn.net/feisan/article/details/1843468">Django下碰到EF BB BF问题</a><br /><a href="http://www.cnblogs.com/myths/articles/2099716.html">php utf-8编码include页面空格</a><img src ="http://www.blogjava.net/leekiang/aggbug/371182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2012-03-03 23:26 <a href="http://www.blogjava.net/leekiang/archive/2012/03/03/371182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于resin</title><link>http://www.blogjava.net/leekiang/archive/2011/04/19/348584.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 19 Apr 2011 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/04/19/348584.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/348584.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/04/19/348584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/348584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/348584.html</trackback:ping><description><![CDATA[		1，在resin3.0中，deploy是默认的发布目录，在MyEclipse中直接发布到resin的deploy目录中，起动服务器就会运行发布的项目，而在resin-3.1.1中发布到deploy目录下的项目不会运行，需要修改conf目录下的resin.conf文件，里面有一行 &lt;web-app-deploy path="webapps"/&gt;是设置发布目录路径的，我们在后边加上一行 &lt;web-app-deploy path="deploy"/&gt;，这样在deploy目录下的项目就能正常运行了。<br />   还有一个办法，我没试过：在&lt;host id="" root-directory="."&gt;标记中找到&lt;/web-app&gt;在这个标记后面手动添加一行配置 &lt;web-app id="/项目名称" root-directory="deploy/项目名称"/&gt; <br /><br />2，resin2.1.17 官方下载地址<br />官网上已经没有相关下载链接，但是文件还在，趁早下吧，用3以上版本就得付费买证书了<br />
Linux：<a href="http://caucho.com/download/resin-2.1.17.tar.gz" target="_top" rel="nofollow">http://caucho.com/download/resin-2.1.17.tar.gz</a><br />
win：<a href="http://caucho.com/download/resin-2.1.17.zip">http://caucho.com/download/resin-2.1.17.zip</a><br />好像resin2的最后一个版本是2.1.18<br /><br />3，<br />resin<span class="javascript" id="text76898">2.x支持JSP 1.2/Servlet 2.3<br />3.X支持JSP 2.0/Servlet 2.4<br />3.03不需要许可证<br />3.04开始需要许可证</span><br /><br />4，<a href="http://blog.163.com/new_liu.popo/blog/static/43870921200810313023290/">仔细翻看了Resin2和Resin3的resin.conf文件例子</a>发现Resin2系列采用了资源定义的方式统一化的定义各种雷动的配置，而Resin3则把它省略成直接用res-ref-name作为限定标识的形式，这样的利弊很容易看出：<br />利：调用配置方便程序可以更简洁的读取配置，同时使配置更为简洁。<br />弊：这样的形式虽然使程序简洁，配置方便但同时带来了程序上管理更为复杂每个资源定义名的判断都需单独判断而不能在程序内统一判断 <br /><br />5，<br /><font>要想让resin能够动态加载class，要三个条件，1.高版本的resin  2.与之相匹配的jdk 3.以-Xdebug方式启动。<a target="_blank" href="http://fengyouhua.iteye.com/blog/51458">来源</a></font><br /><br />6，<br />resin.conf里面有一段内容如下所示： <br />  &lt;!-- <br />     - Ping to test if the web server is still up.  You can uncomment this <br />     - and point it to pages on the webserver that exercise your main <br />     - logic (like database access).  If the GET fails, it will restart <br />     - the server.  This will catch deadlocks, but not JDK freezes. <br />     - &lt;ping sleep-time=’1m’ retry-count=’3’ retry-time=’1s’&gt; <br />     -   &lt;url&gt;http://localhost:8080/ping/ping.jsp&lt;/url&gt; <br />     - &lt;/ping&gt; <br />   --&gt; <br />这段内容默认情况下是被注释的。它的功能是让Resin每隔一分钟就测试一下能否访问/ping/ping.jsp文件，测试时间是1s，如果不成功，就重试三次。如果三次都不成功，Resin就自动重启。<br /><br />7,<br />报错：sun.tools.javac.Main 已过时
<br />
把<span class="wp_keywordlink_affiliate"></span>配置文件中的<br />
&lt;java compiler=”internal" compiler-args="" /&gt;<br />
改为：<br />
&lt;java compiler="javac" compiler-args="" /&gt;<br /><br />8,resin2和resin3配置的部分区别<br />1)使用datasource时，resin3好像需要把mysql驱动放到resin3\lib下，而resin2只需要放到web应用的lib下？<br />2)<br />resin2:&lt;web-app id='/' app-dir='C:/resin2/webapps/blog'&gt;<br />resin3:&lt;web-app id='/' document-directory='C:/resin3/deploy/blog'&gt;<br />3)数据源<br />resin2:<br />&lt;resource-ref&gt;&lt;res-ref-name&gt;jdbc/blog&lt;/res-ref-name&gt;&lt;res-type&gt;javax.sql.DataSource&lt;/res-<br /><br />type&gt;&lt;init-param driver-name="com.mysql.jdbc.Driver"/&gt;&lt;init-param <br /><br />url="jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&amp;amp;characterEncoding=UTF-8"/&gt;&lt;init-<br /><br />param user="blog"/&gt;&lt;init-param password="blog" /&gt;&lt;init-param max-connections="50"/&gt;&lt;init-<br /><br />param max-idle-time="50"/&gt;&lt;/resource-ref&gt;<br /><br />resin3:<br />  &lt;database&gt;&lt;jndi-name&gt;jdbc/blog&lt;/jndi-name&gt;&lt;driver type="com.mysql.jdbc.Driver"&gt;      <br />&lt;url&gt;jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/url&gt;&lt;user&gt;blog&lt;/user&gt;&lt;password&gt;blog&lt;/password&gt;&lt;/driver&gt;&lt;/database&gt;<br /><br />9,myeclipse下使用resin调试jsp<br />修改resin.conf：<br />
&lt;javac compiler="internal" args="-g -source 1.5"/&gt;<br />加上-g就行了。<br />好像resin2不行<br /><br />18,<br /><br /><a target="_blank" href="http://blog.csdn.net/lihua2915/archive/2010/11/09/5997105.aspx">TOMCAT与Resin之比较</a><br /><a target="_blank" href="http://blog.sina.com.cn/s/blog_6fd4a99b0100mgbg.html">Apache+resin系统按路径分发的实现及其负载均衡中的session机制</a><br /><a target="_blank" href="http://blog.163.com/_l_g_x/blog/static/124162220085121081257/">Resin与apache整合实现负载均衡</a><br /><a target="_blank" href="http://blog.163.com/new_liu.popo/blog/static/438709212008101131726570/">关于resin的 session 的持久化</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/348584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-04-19 17:37 <a href="http://www.blogjava.net/leekiang/archive/2011/04/19/348584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adding Socket Timeout to java.net.URLConnection (JDK 1.2)</title><link>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 14 Apr 2010 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318278.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318278.html</trackback:ping><description><![CDATA[
		<h1 style="">Adding Socket Timeout to java.net.URLConnection (JDK 1.2)</h1>
		<h2>found a bug , see "connected = true;" in  public void connect() 
throws IOException {</h2>
		<hr />
		<h1>Note: 05/11/01 Sam Found a patch for borland</h1>
		<p>As I got the email:</p>
		<p>Just writing to inform you theis patch for 1.3 works with the 1.3 
shipped with borland JBuilder 4 
(not sure which excat version it is)</p>
		<p>the only problems I had where that the code was a bit messed up,  
following are the changes made to it to make it work. </p>
		<pre>
				<br />  public void SetTimeout(int i) <br />    throws SocketException <br />  { <br />    this.timeout = i; // Should be i not -1   &lt;------------ERROR <br />    serverSocket.setSoTimeout(i) ; <br />  } <br /><br />  public boolean parseHTTP(MessageHeader header, ProgressEntry entry) <br />    throws java.io.IOException <br />  { <br />    if( this.timeout != -1 ) { <br />      try { <br />        serverSocket.setSoTimeout(timeout) ; // should be timeout not i &lt;---------------ERROR <br />      } catch( SocketException e ) { <br />        throw new java.io.IOException("unable to set socket timeout!") ; <br />      } <br />    } <br /><br />    return super.parseHTTP(header, entry) ; <br />  } <br />Sam <br /></pre>
		<p>Under JDK 1.3, which is HTTP 1.1 compatible, the 
InterruptedIOException gets caught by 
the socket I/O routines and ignored.  input is read in "chunks". I 
debugged the existing code under 1.3, the Timeout is getting set 
properly etc.,
but the exception gets caught in the underlying I/O routines, which have
 a single
retry if any IOExceptions are thrown.  Thanks a lot Sun....</p>
		<h1>3/22/01: Patch for JDK 1.3 unverified</h1>
		<p>Patch code for JDK 1.3 from Matt Ho (unverified)</p>
		<pre>
				<br />----[ snip ]----<br /><br />import sun.net.www.MessageHeader ;<br />import sun.net.ProgressEntry ;<br /><br />.<br />.<br />.<br /><br />  private int timeout = -1 ;<br /><br />  public void SetTimeout(int i)<br />    throws SocketException<br />  {<br />    this.timeout = -1 ;<br />    serverSocket.setSoTimeout(i) ;<br />  }<br /><br />  public boolean parseHTTP(MessageHeader header, ProgressEntry entry)<br />    throws java.io.IOException<br />  {<br />    if( this.timeout != -1 ) {<br />      try {<br />        serverSocket.setSoTimeout(i) ;<br />      } catch( SocketException e ) {<br />        throw new java.io.IOException("unable to set socket timeout!") ;<br />      }<br />    }<br /><br />    return super.parseHTTP(header, entry) ;<br />  }<br /><br />----[ snip ]----<br /><br /></pre>
		<h1>On with the rest of the stuff</h1>
		<p>The BSD socket API supports a timeout option (the option is 
SO_TIMEOUT), which is also supported in java.net.socket.  
Unfortunately, java.net.URLConnection does not expose the underlying 
socket.  So if you have a URL connection that attempts to 
connect to a dead URL (i.e., the URL is well formed and exists but the 
site is down), the socket will eventually timeout using the
operating system's default timeout (420 seconds on Win NT).  The timeout
 is a very long time, e.g., for spiders or URL checking.</p>
		<p>The following files illustrate a technique to introduce a socket 
timeout to URL connection, based upon the actual java 
source code itself (see the open source community licensing at <a href="http://www.javasoft.com/">JavaSoft</a>).</p>
		<h2>The Base classes, or URLConnection internals</h2>
		<p>Java's implementation of networking is protocol independent, as well 
as object oriented.  Therefore the implementation is not as 
straightfoward
as one might imagine.</p>
		<p>URLConnection relies upon several internal classes using a 
client/server model as well as a "factory" design pattern. The client's 
base class 
is  <i>sun.net.www.http.HttpClient</i>.  This class is extended for the 
purpose of exposing the socket.</p>
		<p>The default factory is <i>URLStreamHandlerFactory</i>, which 
indirectly "handles" the creation of an HTTP client by instantiating 
a class that is specific to the HTTP protocol: <i>sun.net.www.protocol.http.Handler</i>.
  The handler actually creates the client.</p>
		<p>In practice, the factory is only necessary to mimic java's 
implementation, but only the Handler is really needed.</p>
		<h2>Derived Classes</h2>
		<p>We derive 4 classes so as to preserve the symmetry with the java 
source code:</p>
HttpURLConnectionTimeout extends 
sun.net.www.protocol.http.HttpURLConnection<br /> 
HttpTimeoutHandler extends sun.net.www.protocol.http.Handler<br />
HttpTimeoutFactory implements java.net.URLStreamHandlerFactory<br />
HttpClientTimeout extends sun.net.www.http.HttpClient<br /><p>On with the source code.</p><br /><h2>HttpURLConnectionTimeout</h2><pre>// whatever package you want<br />import sun.net.www.http.HttpClient;<br />import java.net.*;<br />import java.io.*;<br />public class HttpClientTimeout extends HttpClient<br />{<br />    public HttpClientTimeout(URL url, String proxy, int proxyPort) throws IOException<br />	{<br />		super(url, proxy, proxyPort);<br />	}<br /><br />    public HttpClientTimeout(URL url) throws IOException<br />	{<br />		super(url, null, -1);<br />    }<br /><br />	public void SetTimeout(int i) throws SocketException { <br />    	serverSocket.setSoTimeout(i); <br />    } <br /><br />    /* This class has no public constructor for HTTP.  This method is used to<br />     * get an HttpClient to the specifed URL.  If there's currently an<br />     * active HttpClient to that server/port, you'll get that one.<br />	 *<br />	 * no longer syncrhonized -- it slows things down too much<br />	 * synchronize at a higher level<br />     */<br />    public static HttpClientTimeout GetNew(URL url)  <br />    throws IOException {<br />	/* see if one's already around */<br />	HttpClientTimeout ret = (HttpClientTimeout) kac.get(url);<br />	if (ret == null) {<br />	    ret = new HttpClientTimeout (url);  // CTOR called openServer()<br />	} else {<br />	    ret.url = url;<br />	}<br />	// don't know if we're keeping alive until we parse the headers<br />	// for now, keepingAlive is false<br />	return ret;<br />    }<br /><br />	public void Close() throws IOException<br />	{<br />		serverSocket.close();<br />	}<br /><br />	public Socket GetSocket()<br />	{<br />		return serverSocket;<br />	}<br /><br /><br />}<br /></pre><br /><h2>HttpTimeoutFactory</h2><pre>import java.net.*;<br /><br />public class HttpTimeoutFactory implements URLStreamHandlerFactory<br />{<br />	int fiTimeoutVal;<br />	public HttpTimeoutFactory(int iT) { fiTimeoutVal = iT; }<br />	public URLStreamHandler createURLStreamHandler(String str)<br />	{<br />		return new HttpTimeoutHandler(fiTimeoutVal); <br />	}<br /><br />}<br /></pre><br /><h2>HttpTimeoutHandler</h2><pre>import java.net.*;<br />import java.io.IOException;<br /><br />public class HttpTimeoutHandler extends sun.net.www.protocol.http.Handler<br />{<br />	int fiTimeoutVal;<br />	HttpURLConnectionTimeout fHUCT;<br />	public HttpTimeoutHandler(int iT) { fiTimeoutVal = iT; }<br /><br />    protected java.net.URLConnection openConnection(URL u) throws IOException {<br />		return fHUCT = new HttpURLConnectionTimeout(u, this, fiTimeoutVal);<br />    }<br /><br />    String GetProxy() { return proxy; }		// breaking encapsulation<br />    int GetProxyPort() { return proxyPort; }    // breaking encapsulation<br /><br />	public void Close() throws Exception <br />	{<br />		fHUCT.Close();<br />	}<br /><br />	public Socket GetSocket()<br />	{<br />		return fHUCT.GetSocket();<br />	}<br />}<br /></pre><br /><h2>HttpURLConnectionTimeout</h2><pre>import java.net.*;<br />import java.io.*;<br />import sun.net.www.http.HttpClient;<br /><br />public class HttpURLConnectionTimeout extends sun.net.www.protocol.http.HttpURLConnection<br />{<br />	int fiTimeoutVal;<br />    HttpTimeoutHandler fHandler;<br />	HttpClientTimeout fClient;<br />  	public HttpURLConnectionTimeout(URL u, HttpTimeoutHandler handler, int iTimeout) throws IOException<br />	{   <br />    	super(u, handler);<br />		fiTimeoutVal = iTimeout;<br />	}<br /><br />	public HttpURLConnectionTimeout(URL u,  String host, int port) throws IOException<br />	{  <br />    	super(u, host, port);<br />	}<br /><br />    public void connect() throws IOException {<br />	if (connected) {<br />	    return;<br />	}<br />	try {<br />	    if ("http".equals(url.getProtocol()) /* &amp;&amp; !failedOnce &lt;- PRIVATE */ ) {<br />		// for safety's sake, as reported by KLGroup<br />		synchronized (url)<br />		{<br />			http = HttpClientTimeout.GetNew(url);<br />		}<br />		fClient = (HttpClientTimeout)http;<br />   		((HttpClientTimeout)http).SetTimeout(fiTimeoutVal);<br />	    } else {<br />		// make sure to construct new connection if first<br />		// attempt failed<br />		http = new HttpClientTimeout(url, fHandler.GetProxy(), fHandler.GetProxyPort());<br />	    }<br />	    ps = (PrintStream)http.getOutputStream();<br />	} catch (IOException e) {<br />	    throw e;  }<br />		// this was missing from the original version<br />		connected = true;<br />	}<br /><br />    /**<br />     * Create a new HttpClient object, bypassing the cache of<br />     * HTTP client objects/connections.<br />     *<br />     * @param url	the URL being accessed<br />     */<br />    protected HttpClient getNewClient (URL url)<br />    throws IOException {<br />		HttpClientTimeout client = new HttpClientTimeout (url, (String)null, -1);<br />		try {<br />		client.SetTimeout(fiTimeoutVal);<br />		} catch (Exception e) <br />		{ System.out.println("Unable to set timeout value"); }<br />	return (HttpClient)client; <br />    }<br /><br />    /**<br />     * opens a stream allowing redirects only to the same host.<br />     */<br />    public static InputStream openConnectionCheckRedirects(URLConnection c)<br />	throws IOException<br />    {<br />        boolean redir;<br />        int redirects = 0;<br />        InputStream in = null;<br /><br />        do {<br />            if (c instanceof HttpURLConnectionTimeout) {<br />                ((HttpURLConnectionTimeout) c).setInstanceFollowRedirects(false);<br />            }<br /><br />            // We want to open the input stream before<br />            // getting headers, because getHeaderField()<br />            // et al swallow IOExceptions.<br />            in = c.getInputStream();<br />            redir = false;<br /><br />            if (c instanceof HttpURLConnectionTimeout) {<br />                HttpURLConnectionTimeout http = (HttpURLConnectionTimeout) c;<br />                int stat = http.getResponseCode();<br />                if (stat &gt;= 300 &amp;&amp; stat &lt;= 305 &amp;&amp;<br />                        stat != HttpURLConnection.HTTP_NOT_MODIFIED) {<br />                    URL base = http.getURL();<br />                    String loc = http.getHeaderField("Location");<br />                    URL target = null;<br />                    if (loc != null) {<br />                        target = new URL(base, loc);<br />                    }<br />                    http.disconnect();<br />                    if (target == null<br />                        || !base.getProtocol().equals(target.getProtocol())<br />                        || base.getPort() != target.getPort()<br />                        || !HostsEquals(base, target)<br />                        || redirects &gt;= 5)<br />                    {<br />                        throw new SecurityException("illegal URL redirect");<br />		    }<br />                    redir = true;<br />                    c = target.openConnection();<br />                    redirects++;<br />                }<br />            }<br />        } while (redir);<br />        return in;<br />    }<br /><br />    // Same as java.net.URL.hostsEqual<br /><br /><br />	static boolean HostsEquals(URL u1, URL u2) <br />    { <br />        final String h1 = u1.getHost();<br />        final String h2 = u2.getHost();<br /><br />        if (h1 == null) {<br />            return h2 == null;<br />        } else if (h2 == null) {<br />            return false;<br />        } else if (h1.equalsIgnoreCase(h2)) {<br />            return true;<br />        }<br />            // Have to resolve addresses before comparing, otherwise<br />            // names like tachyon and tachyon.eng would compare different<br />        final boolean result[] = {false};<br /><br />        java.security.AccessController.doPrivileged(<br />            new java.security.PrivilegedAction() {<br />            public Object run() {<br />            try {<br />                InetAddress a1 = InetAddress.getByName(h1);<br />                InetAddress a2 = InetAddress.getByName(h2);<br />                result[0] = a1.equals(a2);<br />            } catch(UnknownHostException e) {<br />            } catch(SecurityException e) {<br />            }<br />            return null;<br />            }<br />        });<br /><br />        return result[0];<br />	}<br /><br />	void Close() throws Exception<br />	{<br />		fClient.Close();<br />	}<br /><br />	Socket GetSocket()<br />	{<br />		return fClient.GetSocket();<br />	}<br />}<br /><br /></pre><h2>Sample Usage #1</h2><pre>import java.net.*;<br />public class MainTest<br />{<br /><br />	public static void main(String args[])<br />	{<br />	    int i = 0;<br />    	try {<br />			URL theURL = new URL((URL)null, "http://www.snowball.com", new HttpTimeoutHandler(150)); // timeout value in milliseconds<br /><br />	        // the next step is optional<br />			theURL.setURLStreamHandlerFactory(new HttpTimeoutFactory(150));<br /><br /><br />			URLConnection theURLconn = theURL.openConnection();<br />	        theURLconn.connect();<br />    	    i = theURLconn.getContentLength();<br />        }<br />        catch (InterruptedIOException e)<br />        {<br />        	System.out.println("timeout on socket");<br />        }<br />        System.out.println("Done, Length:" + i);<br />	}<br />}<br /></pre><br /><h2 style="">Sample Usage #2</h2><pre>		try<br />		{<br />			HttpTimeoutHandler xHTH = new HttpTimeoutHandler(10);	// timeout value in milliseconds<br />	        URL theURL = new URL((URL)null, "http://www.javasoft.com", xHTH);<br />	        HttpURLConnection theUC = theURL.openConnection();<br />			.<br />			.<br />			.<br />		}<br />		catch (InterruptedIOException e)<br />		{<br />			// socket timed out<br /><br />		}<br /></pre><br /><p>Some remarks: this code is thread safe.</p><p>More to come</p><p>来源:http://www.logicamente.com/sockets.html</p><p>     http://www.edevs.com/java-programming/15068/</p><p><br /></p><p>Thanks Felipe!</p><p style="">If I understand information at 
http://www.logicamente.com/sockets.html correctly there are 2 problems 
with timeout when using HttpURLConnection in JDK 1.3:</p><p style="">1. 
HttpURLConnection does not allow changing the default timeout that is in
 order of few minutes.</p><p>2. If actual HTTP stream is chunked then 
HttpURLConnection ignores even the default timeout and tries to read 
what it perceives as a continued stream resulting in indefinite read 
wait.</p><p>The patch shown at the above URL, consisting of subclassing 
of 4 system classes (1 from java.net... and 3 from sun.net.www...), is 
aimed to resolve problem 1 above but does not help in problem 2.</p><p>My
 main problem is to have timeout when reading chunked stream (system 
default timeout will be ok to beginning with) and therefore the question
 is if this bug has been corrected in later versions of JDK? Thanks.</p><p>-----<br /></p><p style="">I have seen much chat about this "problem", that is 
setSoTimeout not available or not working properly.</p><p>how about you 
write your own Timer (resettable) or 1.4 has Timer class</p><p>you just 
reset it anytime you detect network activity and close the Socket if the
 Timer finishes its cycle?</p><img src ="http://www.blogjava.net/leekiang/aggbug/318278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-14 17:09 <a href="http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpURLConnection timeout solution</title><link>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 14 Apr 2010 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318274.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318274.html</trackback:ping><description><![CDATA[
		<strong>From:</strong> Niels Campbell (<em>niels_campbell_at_lycos.co.uk</em>)<br /><strong>Date:</strong> 01/23/04<br /><pre>Date: 23 Jan 2004 09:14:16 -0800<br />After spending nearly 3 days on this problem to come up with a
<br /></pre><p>
solution I think it is only right to post the solution.
<br /></p><p>I found that you can't set the soTimeout on an HttpURLConnection 
as
<br />
the sockets are encapsulated within the HttpURLConnection
<br />
implementation.
<br /></p><p>I found Mike Reiche solution in which he uses a handler to set a
<br />
timeout value. This nearly worked. Looking at the code in the rt.jar I
<br />
found that the initial timeout was working, but the call
<br />
parseHTTP(...) in HttpClient was then attempting a second connection
<br />
which had a time out value of 0(infinite).
<br /></p><p>I modified the code to override the doConnect() in the 
NetworkClient
<br />
and managed to get a timeout occurring. To be exact two timeouts
<br />
occur.
<br /></p><p>It works on 
<br />
java version "1.4.0_03"
<br />
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_03-b04)
<br />
Java HotSpot(TM) Client VM (build 1.4.0_03-b04, mixed mode)
<br />
and
<br />
java version "1.2.2"
<br />
Classic VM (build JDK-1.2.2_013, native threads, symcjit)
<br /></p><p>Anyway here is the code, excuse the formatting.
<br /></p><p>/* HttpTimeoutURLConnection.java */
<br />
import java.net.*;
<br />
import java.io.*;
<br />
import sun.net.www.http.HttpClient;
<br /></p><p>// Need to override any function in HttpURLConnection that create
 a
<br />
new HttpClient
<br />
// and create a HttpTimeoutClient instead. Those functions are
<br />
// connect(), getNewClient(), getProxiedClient()
<br /></p><p>public class HttpTimeoutURLConnection extends
<br />
sun.net.www.protocol.http.HttpURLConnection
<br />
{
<br /></p><p>    public HttpTimeoutURLConnection(URL u, HttpTimeoutHandler 
handler,
<br />
int iSoTimeout)
<br />
        throws IOException
<br />
    {
<br />
        super(u, handler);
<br />
        HttpTimeoutClient.setSoTimeout(iSoTimeout);
<br />
    }
<br /></p><p>    public void connect() throws IOException
<br />
    {
<br />
        if (connected)
<br />
        {
<br />
            return;
<br />
        }
<br /></p><p>        try
<br />
        {
<br />
            if ("http".equals(url.getProtocol())) // &amp;&amp; 
!failedOnce &lt;-
<br />
PRIVATE
<br />
            {
<br />
                // for safety's sake, as reported by KLGroup
<br />
                synchronized (url)
<br />
                {
<br />
                    http = HttpTimeoutClient.getNew(url);
<br />
                }
<br />
            }
<br />
            else
<br />
            {
<br />
                if (handler instanceof HttpTimeoutHandler)
<br />
                {
<br />
                    http = new HttpTimeoutClient(super.url,
<br />
((HttpTimeoutHandler)handler).getProxy(),
<br />
((HttpTimeoutHandler)handler).getProxyPort());
<br />
                }
<br />
                else
<br />
                {
<br />
                    throw new IOException("HttpTimeoutHandler
<br />
expected");
<br />
                }
<br />
            }
<br /></p><p>            ps = (PrintStream)http.getOutputStream();
<br />
        }
<br />
        catch (IOException e)
<br />
        {
<br />
            throw e;
<br />
        }
<br /></p><p>        connected = true;
<br />
    }
<br /></p><p>    protected HttpClient getNewClient(URL url)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
<br />
(url, (String)null, -1);
<br />
        return httpTimeoutClient;
<br />
    }
<br /></p><p>    protected HttpClient getProxiedClient(URL url, String 
s, int i)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
<br />
(url, s, i);
<br />
        return httpTimeoutClient;
<br />
    }
<br /></p><p>}
<br /></p><p>/* HttpTimeoutHandler.java */
<br />
import java.net.*;
<br />
import java.io.IOException;
<br /></p><p>public class HttpTimeoutHandler extends
<br />
sun.net.www.protocol.http.Handler
<br />
{
<br />
    private int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutHandler(int iSoTimeout)
<br />
    {
<br />
        // Divide the time out by two because two connection attempts
<br />
are made
<br />
        // in HttpClient.parseHTTP()
<br /></p><p>        if (iSoTimeout%2!=0)
<br />
        {
<br />
            iSoTimeout++;
<br />
        }
<br />
        this.iSoTimeout = (iSoTimeout/2);
<br />
    }
<br /></p><p>    protected java.net.URLConnection openConnection(URL u) throws
<br />
IOException
<br />
    {
<br />
        return new HttpTimeoutURLConnection(u, this, iSoTimeout);
<br />
    }
<br /></p><p>    protected String getProxy()
<br />
    {
<br />
        return proxy;
<br />
    }
<br /></p><p>    protected int getProxyPort()
<br />
    {
<br />
        return proxyPort;
<br />
    }
<br />
}
<br /></p><p>/* HttpTimeoutFactory.java */
<br />
import java.net.*;
<br /></p><p>public class HttpTimeoutFactory implements 
URLStreamHandlerFactory
<br />
{
<br />
    private int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutFactory(int iSoTimeout)
<br />
    {
<br />
        this.iSoTimeout = iSoTimeout;
<br />
    }
<br /></p><p>    public URLStreamHandler createURLStreamHandler(String str)
<br />
    {
<br />
        return new HttpTimeoutHandler(iSoTimeout);
<br />
    }
<br />
}
<br /></p><p>/* HttpTimeoutClient.java */
<br />
import sun.net.www.http.HttpClient;
<br />
import java.net.*;
<br />
import sun.net.*;
<br />
import sun.net.www.*;
<br />
import java.io.*;
<br /></p><p>public class HttpTimeoutClient extends HttpClient
<br />
{
<br />
    private static int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutClient(URL url, String proxy, int 
proxyPort)
<br />
throws IOException
<br />
    {
<br />
        super(url, proxy, proxyPort);
<br />
    }
<br /></p><p>    public HttpTimeoutClient(URL url) throws IOException
<br />
    {
<br />
        super(url, null, -1);
<br />
    }
<br /></p><p>    public static HttpTimeoutClient getNew(URL url)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = (HttpTimeoutClient)
<br />
kac.get(url);
<br /></p><p>        if (httpTimeoutClient == null)
<br />
        {
<br />
            httpTimeoutClient = new HttpTimeoutClient (url);  // CTOR
<br />
called openServer()
<br />
        }
<br />
        else
<br />
        {
<br />
            httpTimeoutClient.url = url;
<br />
        }
<br /></p><p>        return httpTimeoutClient;
<br />
    }
<br /></p><p>    public static void setSoTimeout(int iNewSoTimeout)
<br />
    {
<br />
        iSoTimeout=iNewSoTimeout;
<br />
    }
<br /></p><p>    public static int getSoTimeout()
<br />
    {
<br />
        return iSoTimeout;
<br />
    }
<br /></p><p>    // Override doConnect in NetworkClient
<br /></p><p>    protected Socket doConnect(String s, int i)
<br />
        throws IOException, UnknownHostException, SocketException
<br />
    {
<br />
        Socket socket=super.doConnect(s,i);
<br /></p><p>        // This is the important bit
<br />
        socket.setSoTimeout(iSoTimeout);
<br />
        return socket;
<br />
    }
<br /></p><p>}
<br /></p><p>/* Example use */
<br />
import java.util.*;
<br />
import java.io.*;
<br />
import java.net.*;
<br /></p><p>public class SystemProperty
<br />
{
<br />
    public static void main(String[] args)
<br />
    {
<br />
        String sSoapUrl="<a href="http://192.168.0.223/mobaqSecurity/SslTunnelServlet">http://192.168.0.223/mobaqSecurity/SslTunnelServlet</a>";
<br />
        System.out.println("Connecting to [" + sSoapUrl + "]");
<br /></p><p>        URLConnection urlConnection = null;
<br />
        URL url=null;
<br /></p><p>        try
<br />
        {
<br />
            url = new URL((URL)null, sSoapUrl, new
<br />
HttpTimeoutHandler(10000));
<br />
            urlConnection = url.openConnection();
<br /></p><p>            // Optional
<br />
            url.setURLStreamHandlerFactory(new
<br />
HttpTimeoutFactory(10000));
<br /></p><p>            System.out.println("Url class
<br />
["+urlConnection.getClass().getName()+"]");
<br />
        }
<br />
        catch (MalformedURLException mue)
<br />
        {
<br />
            System.out.println("&gt;&gt;MalformedURLException&lt;&lt;");
<br />
            mue.printStackTrace();
<br />
        }
<br />
        catch (IOException ioe)
<br />
        {
<br />
            System.out.println("&gt;&gt;IOException&lt;&lt;");
<br />
            ioe.printStackTrace();
<br />
        }
<br /></p><p>        HttpURLConnection httpConnection =
<br />
(HttpURLConnection)urlConnection;
<br />
        System.out.println("Connected to [" + sSoapUrl + "]");
<br /></p><p>        byte[] messageBytes=new byte[10000];
<br />
        for (int i=0; i&lt;10000; i++)
<br />
        {
<br />
            messageBytes[i]=80;
<br />
        }
<br /></p><p>        try
<br />
        {
<br />
            httpConnection.setRequestProperty("Connection", "Close");
<br />
            httpConnection.setRequestProperty("Content-Length",
<br />
String.valueOf(messageBytes.length));
<br />
            httpConnection.setRequestProperty("Content-Type",
<br />
"text/xml; charset=utf-8");
<br />
            httpConnection.setRequestMethod("POST");
<br />
            httpConnection.setDoOutput(true);
<br />
            httpConnection.setDoInput(true);
<br />
        }
<br />
        catch (ProtocolException pe)
<br />
        {
<br />
            System.out.println("&gt;&gt;ProtocolException&lt;&lt;");
<br />
            pe.printStackTrace();
<br />
        }
<br /></p><p>        OutputStream outputStream=null;
<br /></p><p>        try
<br />
        {
<br />
            System.out.println("Getting output stream");
<br />
            outputStream =httpConnection.getOutputStream();
<br />
            System.out.println("Got output stream");
<br /></p><p>            outputStream.write(messageBytes);
<br />
        }
<br />
        catch (IOException ioe)
<br />
        {
<br />
            System.out.println("&gt;&gt;IOException&lt;&lt;");
<br />
            ioe.printStackTrace();
<br />
        }
<br /></p><p style="">        try
<br />
        {
<br />
            System.out.println("Getting input stream");
<br />
            InputStream is=httpConnection.getInputStream();
<br />
            System.out.println("Got input stream");
<br /></p><p>            byte[] buf = new byte[1000];
<br />
            int i;
<br /></p><p>            while((i = is.read(buf)) &gt; 0)
<br />
            {
<br />
                System.out.println(""+new String(buf));
<br />
            }
<br />
            is.close();
<br />
        }
<br />
        catch (Exception ie)
<br />
        {
<br />
            ie.printStackTrace();
<br />
        }
<br /></p><p>    }
<br />
}
<br /></p>Cheers,
<br />
Niels
<br /><br />来源:http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2004-01/3271.html<br />     http://www.weblogicfans.net/viewthread.php?tid=1101<br />     http://forums.sun.com/thread.jspa?threadID=568948<br />备注：在HttpTimeoutClient类中的第二个构造函数中的：super(url,null,-1)改为super(url,
(String)null,-1)即可。<br /><img src ="http://www.blogjava.net/leekiang/aggbug/318274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-14 17:04 <a href="http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic上HttpURLConnection的超时</title><link>http://www.blogjava.net/leekiang/archive/2010/04/14/318272.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 14 Apr 2010 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/14/318272.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318272.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/14/318272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318272.html</trackback:ping><description><![CDATA[System.setProperty("sun.net.client.defaultConnectTimeout", "500");<br />System.setProperty("sun.net.client.defaultReadTimeout", "500");<br />在jdk1.4.2_05下测http,上面的代码是生效的,https没有试。<br />好像jdk1.4.2.12解决了https的问题,见jdk1.4的bug清单。<br />HttpURLConnection的实现类正常情况下是sun.net.www.protocol.http.HttpURLConnection<br />而weblogic8下是weblogic.net.http.SOAPHttpURLConnection。<br />SOAPHttpURLConnection是weblogic.net.http.HttpURLConnection的子类<br />System.setProperty("weblogic.client.SocketConnectTimeoutInSecs", "500");在sp4不管用<br />-Dweblogic.client.SocketConnectTimeoutInSecs=500也不管用。<br /><br />在http://forums.oracle.com/forums/thread.jspa?threadID=766767里有人说<br />Well, it depends on the OS and JVM used. If Weblogic is using Native library (socket Muxer) for remote communication then socketconnectTimeout only helps when thread is stuck on "Socket.connect() method, but it would never timeout the socket if it is stuck on "Socket.read()" because the Control does not return to JVM till OS level TCP/IP connection returns.<br />To resolve this issue, try to timeout TCP connections at OS level using OS parameters. Hopefully BEA would come with some resolution of this issue in future release<br /><br />应该使用"weblogic.http.client.defaultConnectTimeout"属性<br />在weblogic9的weblogic.net.http.HttpURLConnection类里找到如下的代码<br />defaultConnectTimeout = Integer.getInteger("weblogic.http.client.defaultConnectTimeout", -1).intValue();<br />而在weblogic8.1 sp4的该类里没找到，或许sp5就有了(见http://download.oracle.com/docs/cd/E13222_01/wls/docs81///javadocs/weblogic/net/http/HttpURLConnection.html)<br /><br />  现在的问题是，对于这种问题可不可以通过超时设定来释放线程。weblogic中,RJVM(即server之间，可能是admin-to- managed,也可能是managed-to-managed)之间，连接的协议有两类五种，两类是http、t3，五种是http、https、 t3、t3s、local。超时设定时协议层面的东西，所以我们这里只讨论http和t3。<br /><br />       对于t3，从上面的trace可以看到，连接的创建从ServerURL.findOrCreateRJVM()开始，这个方法有多种实现，不同的实现使用不同的timeout，客户端程序可以通过向environment中set一个叫做weblogic.jndi.requestTimeout的变量，如果不做设定，则使用系统默认的DEFAULT_CONNECTION_TIMEOUT，这是个静态值（0）。而在上面的stacktrace中，我们可以看到，environment是在RemoteChannelServiceImpl中定义的，这个environment对于客户而言是不可配置的，而weblogic自己的这个env中是不设定requesttimeotu的，也就是，无论哪种方式，connectionTimeout/readTimeout对于t3，都是不可配置的，而且默认是没有超时的。<br /><br />        而对于http，HTTPClientJVMConnection在创建HttpURLConnection的时候，会读取系统环境变量中的如下两个变量，<br />[b]weblogic.http.client.defaultReadTimeout[/b]<br />[b]weblogic.http.client.defaultConnectTimeout[/b]<br />        如果没有设定，这两个变量的默认值均为-1，即不做timeout。如果我们作了设定，这两个值即读超时、连接超时都会生效。这两个值可以用于解决上述的问题。<br />        weblogic.http.client.defaultReadTimeout<br />weblogic.http.client.defaultConnectTimeout<br /><br />哪里可以设置呢？<br />举例：<br />Windows平台：<br />set JAVA_OPTIONS=-Dweblogic.http.client.defaultReadTimeout=30 -Dweblogic.http.client.defaultConnectTimeout=30 %JAVA_OPTIONS%<br />UNIX/Linux平台：<br />JAVA_OPTIONS="-Dweblogic.http.client.defaultReadTimeout=30 -Dweblogic.http.client.defaultConnectTimeout=30 $JAVA_OPTIONS"<br />export JAVA_OPTIONS<br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/318272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-14 16:59 <a href="http://www.blogjava.net/leekiang/archive/2010/04/14/318272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nginx笔记</title><link>http://www.blogjava.net/leekiang/archive/2010/03/29/316779.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 28 Mar 2010 17:13:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/03/29/316779.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/316779.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/03/29/316779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/316779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/316779.html</trackback:ping><description><![CDATA[
		<a href="http://hi.baidu.com/tty0/blog/item/17dc55eef89801212cf5347c.html">C10K问题探讨</a>
		<br />http://www.kegel.com/c10k.html<br /><br /><br /><a target="_blank" href="http://library.linode.com/web-servers/nginx/installation/centos-5">Host Websites with nginx on CentOS 5</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/316779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-03-29 01:13 <a href="http://www.blogjava.net/leekiang/archive/2010/03/29/316779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat的启动</title><link>http://www.blogjava.net/leekiang/archive/2009/07/30/289107.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 30 Jul 2009 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/07/30/289107.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/289107.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/07/30/289107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/289107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/289107.html</trackback:ping><description><![CDATA[
		<span class="oblog_text">
				<font face="宋体">这个</font>startup.bat<font face="宋体">脚本就是提供给使用者用来修改的，我们可以在其中设置</font>JAVA_HOME<font face="宋体">，</font>CATALINA_HOME<font face="宋体">等环境变量，但我们并不需要深入到较为复杂的</font>catalina.bat<font face="宋体">脚本中，</font><font face="宋体">这正是</font>startup.bat<font face="宋体">脚本的真正用意所在。</font><font face="宋体">我们知道，软件设计模式中有一个重要的原则就是开闭原则，即我们可以允许别人扩展我们的程序，但在程序发布后，我们拒绝任何修改，因为修改会产生新的</font>Bug<font face="宋体">，使得我们已经</font>Bug-free<font face="宋体">的程序又要重新测试。开闭原则是面向对象世界中的一个非常重要的原则，我们可以把这个原则从Java类扩展至源代码级别。</font>startup<font face="宋体">脚本就是要求用户不要修改</font>catalina.bat<font face="宋体">脚本，这是符合软件设计思想的。我们如果想要彻底贯彻这个重要的软件设计原则，可以写一个新脚本</font>tomcat.bat<font face="宋体">，脚本内容大致如下：</font><br /><br />set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09 <br />set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28 <br />call %CATALINA_HOME%\bin\startup.bat <br /><br /><font face="宋体">这个</font>tomcat.bat<font face="宋体">文件可以存放在任何目录并能执行，并且不需要修改</font>tomcat<font face="宋体">自带的任何脚本及其它环境变量，这就彻底贯彻了开闭原则。<br /><br /></font></span>
		<strong>浅析Tomcat的启动</strong>
		<span class="oblog_text">
				<font face="宋体">http://www.56base.com/blog/u/evian/archives/2008/118.html<br /></font>
		</span>
<img src ="http://www.blogjava.net/leekiang/aggbug/289107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-07-30 13:57 <a href="http://www.blogjava.net/leekiang/archive/2009/07/30/289107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache服务器</title><link>http://www.blogjava.net/leekiang/archive/2008/08/06/220515.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 06 Aug 2008 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/08/06/220515.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/220515.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/08/06/220515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/220515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/220515.html</trackback:ping><description><![CDATA[设置系统信息，在Network Domain下填入您的域名（比如：goodwaiter.com），在Server Name下填入您的服务器名称（比如：www.goodwaiter.com，也就是主机名加上域名）。<br />注意:<font color="#ff0000">如果windows里已经装了oracle，则会存在一个8080端口的apache服务，此时安装apache时不要选那个8080端口的，而是要选80端口的,否则这个新的apache安装后没有对应的windows服务。</font><br />     卸载apache后httpd.conf配置文件还在，重装apache时会重用这个文件，不会覆盖。<br />php以module方式与Apache相结合，使php融入Apache，照先前的方法打开Apache的配置文件，Ln
173，找到这里，添加进如图所示选中的两行，第一行“LoadModule php5_module
D:/php/php5apache2.dll”是指以module方式加载php，第二行“PHPIniDir
"D:/php"”是指明php的配置文件php.ini的位置，是当然，其中的“D:/php”要改成你先前选择的php解压缩的目录<br /><a target="_blank" href="http://tech.163.com/06/0206/11/299AMBLT0009159K.html">Apache+php+mysql在windows下的安装与配置图解</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/220515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-08-06 21:51 <a href="http://www.blogjava.net/leekiang/archive/2008/08/06/220515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat笔记</title><link>http://www.blogjava.net/leekiang/archive/2008/08/01/219432.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 01 Aug 2008 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/08/01/219432.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/219432.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/08/01/219432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/219432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/219432.html</trackback:ping><description><![CDATA[1，有时候启动有问题与xml解析有关,在conf/catalina.properties加入<br />javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl<br />javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl<br />参见:<br />http://jefferson.javaeye.com/blog/35239<br />http://dyfh.spaces.live.com/blog/cns!E99B9675D4683F12!1858.entry<br />http://chanson.javaeye.com/blog/151007<br /><br />2,在tomcat后台的Tomcat Manager里可以远程发布war,小心被别人利用，得把管理员密码改掉。<br />参见<a target="_blank" href="http://tech.techweb.com.cn/thread-246920-1-1.html"><span class="bold">走出误区 巧补Tomcat服务器漏洞</span></a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/219432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-08-01 18:42 <a href="http://www.blogjava.net/leekiang/archive/2008/08/01/219432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic性能调优笔记</title><link>http://www.blogjava.net/leekiang/archive/2008/02/27/182560.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 27 Feb 2008 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/02/27/182560.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/182560.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/02/27/182560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/182560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/182560.html</trackback:ping><description><![CDATA[		1,"weblogic.kernel.Default"是从客户端提交请求后产生的线程所在的队列名。这个队列的线程数默认是15个。如果超过15个线程堵塞，则部署的应用将不能访问。同时后台报：<br />&lt;2008-2-27 下午09时37分48秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteThread: '14' for queue: 'weblogic.kernel.Default' has been busy for "1,720" seconds working on the request "Http Request: /myapp/test/index.jsp", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.&gt; <br />2，线程数(Tread Count)：指派到weblogic.kernel.Default队列的线程数。如果你不需要使用超过15个线程（默认），就不必更改这个属性值。<span style="font-size: 12pt;"></span><br />也可以在mydomain下的config.xml中配置<br />&lt;ExecuteQueue Name="weblogic.kernel.Default" ThreadCount="50"/&gt;<br /><br /><br /><br />9,<br /><a target="_blank" href="http://blog.csdn.net/ccsdba/archive/2006/07/04/875672.aspx">Bea Weblogic 8.1 SP5 性能优化</a><br /><a target="_blank" href="http://xiaoyao5201983.spaces.live.com/blog/cns%21e2d9a09b3085bd1e%21273.entry">weblogic中影响性能的参数总结</a><br /><a target="_blank" href="http://topic.csdn.net/u/20070518/21/46811578-e4ee-443c-babb-013e1c564b3d.html">发布在weblogic里的程序随时间越长就越慢</a><br /><a target="_blank" href="http://blog.csdn.net/fidelhl/archive/2007/11/03/1864926.aspx">weblogic中影响性能的参数总结</a><br /><a target="_blank" href="/zhouxing/archive/2007/04/19/111920.html">优化WebLogic服务器性能参数</a><br /><a target="_blank" href="http://www.51testing.com/?8776/action_viewspace_itemid_14956.html">性能调优及UNIX操作</a><br /><a target="_blank" href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7770&amp;start=0&amp;tstart=0">队列长度一直很高，吞吐量不大，访问很慢是怎么回事？</a><br /><a target="_blank" href="http://www.searchfull.net/blog/2007/04/10/1176207938784.html">Thread Dump 和Java应用诊断</a><br /><a target="_blank" href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=35331&amp;messageID=207435">WLS8.15常报socket或连接错误，什么原因？</a><br /><a target="_blank" href="http://blog.sina.com.cn/s/blog_553d5e73010007dv.html">Weblogic服务器性能调优</a><br /><a target="_blank" href="http://topic.csdn.net/t/20041026/17/3493083.html">一个client和server之间的问题</a><br /><a target="_blank" href="http://blog.ccidnet.com/blog.php?do=showone&amp;uid=36421&amp;type=blog&amp;itemid=251288">java,weblogic和jdk性能文档</a><br />http://hi.baidu.com/luyi%5F11/blog/item/d32ea497b0776d6e55fb96d5.html<br />http://hi.baidu.com/amyihohn/blog/item/79fc8d167c96fe51f2de3230.html<br />http://hi.baidu.com/luyi_11/blog/item/5300f1f0279c0aaca40f52d1.html<br />http://www.javaeye.com/topic/140849<br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/182560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-02-27 21:39 <a href="http://www.blogjava.net/leekiang/archive/2008/02/27/182560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic笔记</title><link>http://www.blogjava.net/leekiang/archive/2008/01/02/172052.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 01 Jan 2008 20:11:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/01/02/172052.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/172052.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/01/02/172052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/172052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/172052.html</trackback:ping><description><![CDATA[1，weblogic缺省是150个线程，若请求太多，就会报错，这时需要提高weblogic的线程数<br />2, weblogic8,某应用(myapp)以非war包的方式部署时，其编译后的jsp的类放在以下目录。<br />C:\bea\user_projects\domains\mydomain\MISSERVER\.wlnotdelete\extract\MISSERVER__appsdir_myapp_dir_myapp<br />3，在"IE属性"设置里"高级"选项卡里，有一项："显示友好的HTTP错误消息"，禁用<br />这样错误信息就详细了<br />4,问题:weblogic9,某应用的jar包更新后，不起作用。<br />  解决:在weblogic console里先停止该应用，再删掉，然后重新配置<br /><br />5，WebLogic生产模式下启动时设置自动登录方法：<br />在WebLogic启动脚本相同目录下创建一个密码存储文件boot.properties，文件内容：<br />
username=你的WebLogic的启动用户<br />
password=你的WebLogic的启动密码
<br /><div>再次启动WebLogic就不需要密码了，用户名和密码被WebLogic加密后重新保存。<br /><br />6,org.hibernate.hql.ast. HqlToken 错误 weblogic异常<br />1)、拷贝Hibernate3里带的包<span class="hilite1">antlr</span>-2.7.5H3.jar到%WL_HOME%\server\lib下 <br />2)、修改% mydomain% \ startWebLogic.cmd ： <br />在set CLASSPATH之前加上下面一句： <br />set PRE_CLASSPATH=%WL_HOME%\server\lib\<span class="hilite1">antlr</span>-2.7.5H3.jar; <br />在set CLASSPATH之后加上下面一句： <br />set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%<br />见http://wangzhen-1104.javaeye.com/blog/221444<br /><br />7,weblogic8执行response.setCharacterEncoding报错<br />weblogic8只支持j2ee1.3，而javax.servlet.http.HttpServletResponse.setCharacterEncoding好像是servlet2.4的，它对应的是j2ee1.4。<br /><br />8, <a target="_blank" href="http://blog.csdn.net/esky2000/archive/2008/07/22/2689929.aspx">如何在WebLogic 8.1.6环境中查找有连接池泄漏的代码 </a><br /><br />9,weblogic8里,如果使用连接池，则<br />rs是ResultSet_oracle_jdbc_driver_OracleResultSetImpl。<br />rs.getBlob取得的是weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB，而不是oracle.sql.BLOB<br />  <br /></div><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/172052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-01-02 04:11 <a href="http://www.blogjava.net/leekiang/archive/2008/01/02/172052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat的URIEncoding的作用(转)</title><link>http://www.blogjava.net/leekiang/archive/2007/10/17/153685.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 17 Oct 2007 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/10/17/153685.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/153685.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/10/17/153685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/153685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/153685.html</trackback:ping><description><![CDATA[tomcat5中，为了保证get数据采用UTF8编码，在server.xml中进行了如下设置：<br />
<br />
&lt;Connector port="8080" maxThreads="150" minSpareThreads="25" <br />
maxSpareThreads="75" enableLookups="false" redirectPort="8443" <br />
acceptCount="100" debug="99" connectionTimeout="20000" <br />
disableUploadTimeout="true" URIEncoding="UTF-8"/&gt;<br />
<br />
这里指定了get时候的数据编码。但是，当使用IIS作为webserver转发servlet/jsp请求给Tomcat时候，这个设置却失效了。其实原因很简单：IIS是通过AJP协议，把请求转发到Tomcat监听的8009端口上的，所以这里针对8080的设置自然就无效了。正确的方法是进行下面的设置：<br />
<br />
&lt;Connector port="8009" enableLookups="false" redirectPort="8443" <br />
debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/&gt;<br />
<img src ="http://www.blogjava.net/leekiang/aggbug/153685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-10-17 21:47 <a href="http://www.blogjava.net/leekiang/archive/2007/10/17/153685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClientAbortException,Connection reset by peer: socket write error (摘自javaeye)</title><link>http://www.blogjava.net/leekiang/archive/2007/08/10/135838.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 10 Aug 2007 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/08/10/135838.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/135838.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/08/10/135838.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/135838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/135838.html</trackback:ping><description><![CDATA[
		<span style="color: red;">
				<font style="color: rgb(255, 0, 0);" color="#000000">  <span style="color: rgb(0, 0, 0);">extremetable导出excel,弹出一个下载窗口,这时不点下载而点取消，则报下面的异常:</span><br />ClientAbortException  </font>Caused by: java.net.SocketException: Connection reset by peer: socket write error</span>
		<p>查了下TOMCAT的文档，解释如下：<br /><span style="color: rgb(0, 0, 255);">Wrap an IOException identifying it as being caused by an abort of a request by a remote client.<br /></span>在BAIDU和GOOGLE上找了下原因，大概归结为： <br /><strong>ClientAbortException: </strong>java.net.SocketException: Connection reset by peer: socket write error的原因是由于处理http连接时，正在输出内容时，用户关闭了IE，会出现一个"ClientAbortException"，属于I/O处理中出现的一个异常，应用服务器应该会捕捉。 <br /><strong>Connection reset by peer</strong>的原因： <br />经常出现的Connection reset by peer: 原因可能是多方面的，不过更常见的原因是： <br />①：服务器的并发连接数超过了其承载量，服务器会将其中一些连接Down掉； <br />②：客户关掉了浏览器，而服务器还在给客户端发送数据； <br />③：浏览器端按了Stop <br />很多人都说是客户端造成的，没有办法控制，是个比较郁闷的问题。</p>
		<p>但是，我担心的是：虽然前台没有任何出错的迹象，但是后台会记录这个异常，日志也会疯狂爆满，时间长了，肯定会DOWN掉的，还没找到好的解决办法<br />resin有一个参数ignore-client-disconnect <br />tomcat似乎没有</p>
		<p>
				<br />
		</p>
		<p>经常出现的Connection reset by peer: 
原因可能是多方面的，不过更常见的原因是：①：服务器的并发连接数超过了其承载量，服务器会将其中一些连接Down掉；②：客户关掉了浏览器，而服务器还
在给客户端发送数据；③：浏览器端按了Stop</p>
		<p>[10054] Connection reset by peer<br />　　Connection reset by peer is a 
tough one because it can be caused by so many things. In all cases, the 
server determines that the socket is no longer good and closes it from 
its side.<br />　　Read Error<br />　　Scenario: Mary couldn't make out what Joe
 was saying anymore, so she hung up rather than lose his messages 
(data). <br />　　A read error occurs when a server cannot successfully read
 from a user's client. Servers gather information from the client by 
text, setup, and other items.When the server receives an error when 
reading from a client, it then disconnects the user, resulting in a read
 error quit message.<br />　　Write Error <br />　　Scenario: Mary was trying to
 talk to Joe but didn't think she was getting through, so she hung 
rather than lose his messages (data). <br />　　A write error occurs when a 
server cannot successfully write to a user's client. When the server 
receives information, it usually responds with information of its own. 
When the server receives an error when writing to a client, it then 
disconnects the user, resulting in a write error quit message similar to
 the read error format.<br />　　Ping Timeout Error <br />　　Scenario: Mary, 
having been raised in a household with too many kids and always craving 
attention, keeps asking to make sure that Joe is still on the line and 
listening. If he doesn't reply fast enough to suit her, she hangs up. <br />　
　Servers automatically ping users at a preset time. The reason for this 
is to ensure the client is still connected to the server. When you see 
"PING? PONG!" results in your status window, it means the server has 
pinged your client, and it has responded back with a pong to ensure the 
server that you are still connected. When this does not happen and you 
disconnect without the server's knowledge, the server will automatically
 disconnect the user when it does not receive a response, resulting in a
 ping timeout. Ping timeouts occur to EVERYONE.<br />　　Broken pipe Error <br />　
　Scenario: Mary had picked up a sticky note with a message she needed to
 relay to Joe, but somehow between her hand and her mouth, the message 
got misplaced. Mary was trying to talk to Joe but didn't think she was 
getting through, so she hung up rather than lose his messages (data). <br />　
　A broken pipe error occurs when the server knows it has a message but 
can't seem to use its internal data link to get the data out to the 
socket.<br />　　Miscellaneous <br />　　Scenario: Lots of other reasons; 
perhaps the operator broke in and gave Mary a message that made her 
doubt the validity of the call so she hung up</p>
		<p>
		</p>
<img src ="http://www.blogjava.net/leekiang/aggbug/135838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-08-10 14:50 <a href="http://www.blogjava.net/leekiang/archive/2007/08/10/135838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat与jboss(摘自javaeye)</title><link>http://www.blogjava.net/leekiang/archive/2007/07/26/132595.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 26 Jul 2007 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/07/26/132595.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/132595.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/07/26/132595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/132595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/132595.html</trackback:ping><description><![CDATA[      如果发布的j2ee应用没有EJB方面的，用jboss和tomcat差别不大。JBoss的Servlet Container也是Tomcat。JBoss做的改进主要是修改了tomcat的session replication部分，使之支持使用JBoss Cache进行session的复制功能。<br />      jboss默认实现了APR,性能要好不少了吧？还有安全框架、数据库连接池、JTA等方面。<br /><br /><br /><a target="_blank" href="http://www.matrix.org.cn/resource/article/2008-01-02/0bfeffb6-b8e3-11dc-ad9e-410871b898d3.html">JBoss，Geronimo还是Tomcat？</a><br /><a target="_blank" href="http://weblogs.java.net/blog/kalali/archive/2007/12/four_open_sourc.html">Four open source Java application servers compared</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/132595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-07-26 17:36 <a href="http://www.blogjava.net/leekiang/archive/2007/07/26/132595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>