Servlet 3.0 异步疑问

问题描述

index.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Simplejsppage</title><metahttp-equiv=""></head><body>Placeyourcontenthere</body><ahref="/async">AsyncDemo</a></html>=========================================================AsyncDemoServlet.javaimportjavax.servlet.AsyncContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Date;@WebServlet(name="AsyncDemoServlet",urlPatterns={"/async"},asyncSupported=true)publicclassAsyncDemoServletextendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{process(request,response);}protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{process(request,response);}privatevoidprocess(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=null;try{response.setContentType("text/html;charset=UTF-8");out=response.getWriter();out.println("进入Servlet的时间:"+newDate()+".<br/>");out.flush();//在子线程中执行业务调用,并由其负责输出响应,主线程退出booleanasyncSupported=request.isAsyncSupported();out.println("是否支持异步:"+asyncSupported+".<br/>");out.flush();out.println("下面开始启动异步处理............<br/>");AsyncContextctx=request.startAsync();ctx.start(newProcessTask(ctx));out.println("异步处理已启动,等待其完成............<br/>");out.println("结束Servlet的时间:"+newDate()+".<br/>");out.println("<br/>");out.flush();}catch(IOExceptionex){}finally{//out.close();}}}===================================ProcessTask.javaimportjavax.servlet.AsyncContext;importjava.io.PrintWriter;importjava.util.Date;publicclassProcessTaskimplementsRunnable{privateAsyncContextctx;publicProcessTask(AsyncContextctx){this.ctx=ctx;}publicvoidrun(){PrintWriterout=null;try{out=ctx.getResponse().getWriter();//等待十秒钟,以模拟业务方法的执行Thread.sleep(5000);out.println("业务处理完毕的时间:"+newDate()+".<br/>");out.flush();ctx.complete();}catch(Exceptione){}finally{out.close();}}}=======================================此段是servlet3.0异步代码,在tomcat7.0.21下测试通过。但在Glassfishserver3.1.1下却无法运行,未找出原因,特来请教。WARNING:StandardWrapperValve[AsyncDemoServlet]:PWC1406:Servlet.service()forservletAsyncDemoServletthrewexceptionjava.lang.IllegalStateException:Requestiswithinthescopeofafilterorservletthatdoesnotsupportasynchronousoperationsatorg.apache.catalina.connector.Request.startAsync(Request.java:3865)atorg.apache.catalina.connector.Request.startAsync(Request.java:3817)atorg.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1040)atjavax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:422)atservlet.AsyncDemoServlet.process(AsyncDemoServlet.java:44)atservlet.AsyncDemoServlet.doGet(AsyncDemoServlet.java:27)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:734)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:847)atorg.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)...................................................

时间: 2024-11-05 16:41:23

Servlet 3.0 异步疑问的相关文章

Servlet 3.0新特性详解

简介:Servlet 是 Java EE 规范体系的重要组成部分,也是 Java 开发人员必须具备的基础技能, Servlet 3.0 是 Servlet 规范的最新版本.本文主要介绍了 Servlet 3.0 引入的若干重要新特性,包括 异步处理.新增的注解支持.可插性支持等等,为读者顺利向新版本过渡扫清障碍. Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本 (Servlet 2.5

[转贴]ASP.NET 2.0 异步页面原理浅析 [1]

原文地址:http://flier-lu.blogcn.com/diary,109210941.shtml 与 ASP.NET 1.0 相比,ASP.NET 2.0 的各方面改进可以说是非常巨大的.但就其实现层面来说,最大的增强莫过于提供了对异步页面的支持.通过此机制,编写良好的页面可以将数据库.WebService 调用等慢速操作,对网站吞吐能力的影响降到最低,并极大的改善网站的平均页面响应速度.本文将从使用和实现两个层面,简单的剖析这一强大机制的原理,以便读者能够更好的应用这一机制.    

《Spring 5 官方文档》18. Web MVC 框架(五)

自定义WebDataBinder初始化 要通过Spring定制与PropertyEditor的请求参数绑定 WebDataBinder,可以使用@InitBinder控制器中的-annotated @InitBinder方法,@ControllerAdvice类中的方法或提供自定义 WebBindingInitializer.有关更多详细信息,请参阅"使用@ControllerAdvice和@RestControllerAdvice建议控制器"一节. 使用@InitBinder自定义数

Servlet3.0中Servlet的使用

1.注解配置        在以往我们的Servlet都需要在web.xml文件中进行配置(Servlet3.0同样支持),但是在Servlet3.0中引入了注解,我们只需要在对应的Servlet类上使用@WebServlet注解进行标记,我们的应用启动之后就可以访问到该Servlet.对于一个@WebServlet而言,有一个属性是必须要的,那就是它的访问路径.@WebServlet中有两个属性可以用来表示Servlet的访问路径,分别是value和urlPatterns.value和urlP

使用异步Servlet改进应用性能

Nikita Salnikov Tarnovski是plumbr的高级开发者,也是一位应用性能调优的专家,他拥有多年的性能调优经验.近日,Tarnovski撰文谈到了如何通过异步Servlet来改进常见的Java Web应用的性能问题. 众所周知,Servlet 3.0标准已经发布了很长一段时间,相较于之前的2.5版的标准,新标准增加了很多特性,比如说以注解形式配置Servlet.web.xml片段.异步处理支持.文件上传支持等.虽然说现在的很多Java Web项目并不会直接使用Servlet进

Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值_jquery

首先来看工程结构图: 项目所需要的包,如下所示: JSP代码: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServe

异步处理

Servlet3.0提供异步处理 在以前的Servlet规范化,如果Servlet作为控制器调用了一个耗时的业务方法,那么必须等到业务方法完全返回之后才能生成响应,这将使用Servlet对业务方法的调用变成一种阻塞式的调用,因此效率比较低. Servlet3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条新线程去调用 耗时业务方法,这样就可以避免等待. Servlet3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletReque

Tomcat 7之无需JDK只需JRE与无需web.xm及J2SE 6.0之真实与谎言?

Tomcat 7之无需JDK只需JRE与无需web.xm及J2SE 6.0之真实与谎言?   当然首先是确定一下,是真实的,吃个定心丸先,不是谎言:)  下载了Tomcat 7 RC4,解压到 D:/OpenSource/Tomcat/7.0.0-RC4 目录下后 先将 JAVA_HOME 变量清除,如果你原先有设置 JAVA_HOME 变量的话,免得产生干扰 在命令行下,先取消 JAVA_HOME 变量  set JAVA_HOME=  然后设置 JRE_HOME 变量  set JRE_HO

深入Jetty源码之Servlet框架及实现(ServletRequest、ServletResponse)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些"服务器端运行的小程序"对服务器实现的无关性(即提升了其可移植性).在Servlet规范有以下几个核心类(接口):ServletContext:定义了一些可以和Servlet Container交互的