设为首页 加入收藏

TOP

Servlet 3.0的AsyncListener接口(二)
2015-07-26 13:14:10 来源: 作者: 【 】 浏览:47
Tags:Servlet 3.0 AsyncListener 接口
请求参数及内容体从而确定请求的类型。
3. 该Servlet发出请求去获取一些资源或数据。
4. Servlet不产生响应并返回。
5. 过了一段时间后,所请求的资源变为可用,此时处理线程继续处理事件,要么在同一个线程,要么通过AsyncContext分派到容器中的某个资源上。


?@WebServlet注释和@WebFilter注释有一个属性——asyncSupported,是布尔类型,默认值为false。当asyncSupported设置为true,则应用通过执行startAsync可以启动一个单独的线程进行异步处理,并把请求和响应的引用传递给这个线程,然后退出原始线程所在的容器。这意味着响应将遍历(相反的顺序)与进入时相同的过滤器(或过滤器链)。直到AsyncContext调用complete时响应才会被提交。如果异步任务在容器启动的分派之前执行,且调用了startAsync并返回给容器,此时应用需负责处理请求和响应对象的并发访问。
?从一个 Servlet分派时,把asyncSupported=true设置为false是允许的。这种情况下,当Servlet的Service方法不支持异步退出时,响应会被提交,且容器负责调用AsyncContext的complete,以便所有感兴趣的AsyncListener能得到触发通知。过滤器作为清理要完成的异步任务持有资源的一种机制,也应该使用AsyncListener.onComplete触发。?
从一个同步Servlet分派到另一个异步Servlet是非法的。不过与该点不同的是当应用调用startAsync时将抛出IllegalStateException。这将允许Servlet只能作为同步的或异步的Servlet。
应用在一个与初始请求所用的不同的线程中等待异步任务直到可以直接写响应,这个线程不知道任何过滤器。如果过滤器想处理新线程中的响应,那就必须在处理进入时的初始请求时包装Response,并且把包装的Response传递给链中的下一个过滤器,并最终交给Servlet。因此,如果响应是包装的(可能被包装多次,每一个过滤器一次),并且应用处理请求并直接写响应,这将只写响应的包装对象,即任何输出的响应都会由响应的包装对象处理。
?当应用在一个单独的线程中读请求时,写内容到响应的包装对象,这其实是从请求的包装对象读取,并写到响应的包装对象,因此对包装对象操作的所有输入或输出将继续存在。如果应用选择这样做的话,它将可以使用AsyncContext一个新线程发起到容器资源的分派请求。这将允许在容器范围内使用像 JSP 这种内容生成技术。?


六、异步监听器接口AsyncListener
?Servlet 3.0为异步处理提供了一个监听器,使用AsyncListener接口表示。此接口负责管理异步事件,它可以监控如下四种事件:
1)异步线程开始时,调用AsyncListener的onStartAsync(AsyncEvent event)方法;
2)异步线程出错时,调用AsyncListener的onError(AsyncEvent event)方法;
3)异步线程执行超时,则调用AsyncListener的onTimeout(AsyncEvent event)方法;
4)异步执行完毕时,调用AsyncListener的onComplete(AsyncEvent event)方法;


要注册一个AsyncListener,只需将准备好的AsyncListener对象传递给AsyncContext对象的addListener()方法即可,如下所示:


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇STOMP协议详解 下一篇Java静态代码分析工具Infer

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: