当前位置: 代码迷 >> J2EE >> Get跟Post方式 对于多个请求的阻塞方式的探讨
  详细解决方案

Get跟Post方式 对于多个请求的阻塞方式的探讨

热度:68   发布时间:2016-04-17 23:09:47.0
Get和Post方式 对于多个请求的阻塞方式的探讨
最近测试多线程编程,发现一个特别奇怪的地方。
先看一段简单的代码,用的jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
System.out.println("进入");
Thread.sleep(1000000);
 %>


首先直接在浏览器输入该jsp页面的地址,即Get方式访问,并打开多个浏览器页多个请求:
第一个请求输出“进入”
第二个请求什么都没有,浏览器直接被阻塞住(根本就没有进入)
(换成ajax的get方式同样)

然后换成使用ajax的post方式:
第一个请求输出“进入”
第二个请求输出“进入”
....

然后添加一个request监听器来做测试:

@WebListener
public class RequestListener implements ServletRequestListener{
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("进入请求,线程:"+Thread.currentThread().getName());
}
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("结束请求,线程:"+Thread.currentThread().getName());
}
}

预料之中的结果:第二个get请求根本没有进入!

最后得出结论:
GET方式,对于同一url的页面访问,第一个请求线程被阻塞,后面所有线程直接阻塞,直到第一个get请求完成得到response
POST方式,多个请求线程间互不干扰。

这是tomcat的原因还是get和post协议本质上的不同点?
------解决思路----------------------
Quote: 引用:
http://www.java-tips.org/other-api-tips-100035/147-httpclient/1364-how-to-use-multiple-threads-for-performing-get-requests.html

这篇可能对你有帮助
------解决思路----------------------
经测试,chrome下,get方式等一段时间后,后台还是打出了“进入”

下面是jsp转换后的java代码

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOExceptionServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
       null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write('\r');
      out.write('\n');

System.out.println("进入");
Thread.sleep(1000000);
 
      out.write('\r');
      out.write('\n');
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

------解决思路----------------------
http://stackoverflow.com/questions/9123120/tomcat-jsps-appear-to-be-running-serially-instead-of-in-parallel-what-am-i-m

问题的原因就是某些浏览器(如chrome)会阻塞相同地址的请求。
  相关解决方案