100分,求教一个困扰了自己两个月的问题,up者都有分,大家一定要帮我啊!
用jsp+servlet+javabean做了一个聊天室,实现了滚屏显示,也就是服务器推送方式。在tomcat3.2.3上面一切正常,但无法移植到tomcat4以上版本和weblogic6.1上。具体问题的出现的情况是这样:
我的聊天室有公聊和私聊两个frame放在同一个框架页面内,两个页面都用下面类似的代码来实现的滚屏输出:
<%@ page autoFlush="false" import="java.lang.Thread"%>
while(true)
{
try
{
if(i<xnxi.size())
{
out.println("<span id=\"chp2\">"+xnxi.get(i)+"</span>");
i++;
out.flush();
}
Thread.currentThread().sleep(2000);
session.getCreationTime();
}
catch(Exception e)
{
break;
}
}
整个页面除了有这样两个frame之外还有另外三个用于显示其他信息的页面,整个系统在tomcat3.*.*的版本上都能正常运行,但一移植到tomcat4及weblogic6.1上的时候,问题就出现了,如果用服务器本身的浏览器登录,一切也正常,但只要是用别的客户机,页面就只能显示出最开始的两个frame,也就是公聊和私聊两个页面,而其后的页面就完全无法显示出来。
一开始,我以为是一些application对象因为jsp和servelt的线程同步问题产生了死锁,于是我又另外做了一个试验,试验如下:
我再次设计了一个框架页面,包含五个frame,前两三个是jsp,后面三个完全是htm,而前三个jsp都是很简单而且雷同的代码,如下:
<%@ page autoFlush="false" import="java.lang.Thread"%>
<%
System.out.println(Thread.currentThread().toString()+" is start");//在系统信息窗口内显示线程开始的信息
for(int i=0;i<20;i++)
{
try
{
out.println("safasdfasdfasdfasdfasdasdfasdfasdfasdf");
i++;
out.flush();
Thread.currentThread().sleep(2000);
}
catch(Exception e)
{
break;
}
}
System.out.println(Thread.currentThread().toString()+" is over");//在系统信息窗口内显示线程结束的信息
%>
这个时候出现的情况是前两个页面在不断的输出信息,而后面的三个页面一就一片空白没有反应,在系统后台信息窗口里面页只显示了两个线程start,而当这个两个线程over了之后,后面的页面就显示出来了,而第三个线程才启动,第三个页面也开始了输出。
后来我又做了一个类似的servlet来替代那三个jsp,但现象都一样。由此我推断,可能是tomcat4以上版本和weblogic6.1在从整个jsp容器层面上开始限制了jsp线程的数量,或者对out对象,或者response对象进行了某种形式的同步锁定,不知各位阅读此贴的高手是否有解决之法。
这个问题已经困扰了我两个月了,如果我的聊天室不能移植到更高的版本上,那它的存在就毫无意义了。我不想面对这样的结局。这个问题我曾经变相的在这个论坛上发过两次贴子,但都没有被解决。这一次只好用最后的两百分一博了,望各位一定关注。