文档章节

Jetty源码-Continuation

robin-yao
 robin-yao
发布于 2015/04/26 21:07
字数 765
阅读 35
收藏 1
点赞 0
评论 0

    本文主要介绍Jetty 异步的请求。Jetty Contination可以用来处理大量的时间比较长的连接请求。

    http异步请求在Servlet3中已经实现,使用十分方便,通过Request获取异步AsyncContext,然后在上面注册自己的异步监听器AsynListener即可。Tomcat7 和Jetty8以上版本等主流的容器都支持Servlet3的异步请求。具体介绍见http://www.importnew.com/8864.html,详细的Demohttps://github.com/WangErXiao/Servlet3-Async。这里不多介绍Servlet3的异步请求。

    Jetty的异步请求的实现模块主要是Continuation。通过continuation机制,HTTP 请求可以被挂起,超时或者异步事件发生后重新开始。Continuation接口包含两个重要的方法是suspend()和resume()。

    当调用continuation.suspend()方法时,会把当前servlet的request和相关的response挂起,request的生命周期将被从Servlet.service(ServletRequest, ServletResponse)扩展到容器,response将不会被提交除非有ContinuationThrowable抛出。调用完suspend方法,注册完异步的handler,直接调用return从Servlet.service方法返回,当前的线程就可以去处理其他任务了。

    任务处理完之后,通过注册好的回调方法调用continuation.resume()。重新用原来的request和reponse发起请求,并从request中获取结果,通过response返回。

    下边是具体的Demo代码:

public class SimpleSuspendResumeServlet extends HttpServlet {
    private MyAsyncHandler myAsyncHandler;
    //初始化异步处理器
    public void init() throws ServletException {
        myAsyncHandler = new MyAsyncHandler() {
            public void register(final MyHandler myHandler) {
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            Thread.sleep(10000);
                            //设置结果,调用resume方法
                            myHandler.onMyEvent("complete!");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        };

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        final PrintWriter writer = response.getWriter();
        final Continuation continuation = ContinuationSupport
                .getContinuation(request);
        if (continuation.isInitial()) {
            sendMyFirstResponse(response);
            continuation.suspend(); // always suspend before registration
            myAsyncHandler.register(new MyHandler() {
                public void onMyEvent(Object result) {
                    continuation.setAttribute("results", result);
                    continuation.resume();
                }
            });
            return; // 然后该线程就可以去处理其他任务了
        }

        if (continuation.isExpired()) {
            sendMyTimeoutResponse(response);
            return;
        }
        //Send the results
        Object results = request.getAttribute("results");
        if(results==null){
            response.getWriter().write("why reach here??");
            continuation.resume();
            return;
        }
        sendMyResultResponse(response, results);
    }

    private interface MyAsyncHandler {
        public void register(MyHandler myHandler);
    }

    private interface MyHandler {
        public void onMyEvent(Object result);
    }

    private void sendMyFirstResponse(HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().write("start---------");
        response.getWriter().flush();
    }

    private void sendMyResultResponse(HttpServletResponse response,
                                      Object results) throws IOException {
        response.getWriter().write("results:" + results);
        response.getWriter().flush();

    }
    private void sendMyTimeoutResponse(HttpServletResponse response)
            throws IOException {
        response.getWriter().write("timeout");
    }
}

    上面代码中的Support,是工厂类,用来生成Continuation。如果当前容器采用的是Servlet3,返回Servlet3Continuation类型的,如果不是返回FauxContinuation类型的。Servlet3Continuation顾名思义是借助Servlet3里的异步机制来实现的,底层的具体实现还是由具体的容器实现,tomcat7,jetty8以上版本都实现Servlet3异步请求功能。FauxContinuation是Continuation阻塞实现方式,主要是针对才非Servlet3的容器,通过ContinuationFilter过滤器,把FauxContinuation添加到request属性中:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    if (_filtered)
    {
        Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
        FilteredContinuation fc;
        if (_faux && (c==null || !(c instanceof FauxContinuation)))
        {
            fc = new FauxContinuation(request);
            request.setAttribute(Continuation.ATTRIBUTE,fc);
        }
        else
            fc=(FilteredContinuation)c;

        boolean complete=false;
        while (!complete)
        {
            try
            {
                if (fc==null || (fc).enter(response))
                    chain.doFilter(request,response);
            }
            catch (ContinuationThrowable e)
            {
                debug("faux",e);
            }
            finally
            {
                if (fc==null)
                    fc = (FilteredContinuation) request.getAttribute(Continuation.ATTRIBUTE);

                complete=fc==null || (fc).exit();
            }
        }
    }
    else
    {
        try
        {
            chain.doFilter(request,response);
        }
        catch (ContinuationThrowable e)
        {
            debug("caught",e);
        }
    }
}

END-------------------------------

转发请标注来源http://my.oschina.net/robinyao/blog/406544

© 著作权归作者所有

共有 人打赏支持
robin-yao
粉丝 146
博文 54
码字总数 61496
作品 0
杭州
Jetty7 Continuation 学习

Jetty Continuation 实际上是一种异步Http技术,他能让Http连接挂起,直到超时或者异步事件发生时,Http连接可以恢复。Jetty Continuation 的技术应用起来不复杂,有几个关键的API,和两种设...

爱coding ⋅ 2012/06/01 ⋅ 1

有人在实际生产环境下使用jetty吗?

现在想用jetty的Continuation功能实现系统的一个即时通信功能。 不知道jetty的性能和稳定性怎么样。 以前都是用的tomcat,没有在正式环境下用过jetty,请大家用过的给点经验之谈。...

ferly ⋅ 2010/06/17 ⋅ 10

号外号外,Jetty 9 正式版发布!!!

Jetty 9 正式版来了!!!版本标签:Jetty 9.0.0.v20130308 Jetty 9 支持 SPDY 和 WebSocket。 下载地址: http://download.eclipse.org/jetty/stable-9/dist/ Maven: http://search.maven.......

oschina ⋅ 2013/03/09 ⋅ 34

Web服务请求异步化介绍(概念篇)

Author:放翁(文初) Date: 2010/6/28 Email:fangweng@taobao.com 围脖: http://t.sina.com.cn/fangweng 前话 在前面的文章中,先给出了Web服务请求异步处理的压力测试报告,从数据角度描述...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

jetty.start.config中英文对照

声明:英语水平不好,翻译当练习玩 # This file controls what file are to be put on classpath or command line. # //这个文件是控制那些文件被加载与命令行配置 # Format is as follows: ...

loowj ⋅ 2011/08/28 ⋅ 0

Jetty 9.3.1.v20150714 发布,支持 HTTP/2

Jetty 9.3.1.v20150714 发布,这是 9.3.x 维护版本,支持HTTP/2,更新内容如下: + 441020 Support HEADERS followed by CONTINUATION+. + 460671 Rationalize property names (fix for jet......

oschina ⋅ 2015/07/17 ⋅ 6

OpenFire与其他消息服务器交互

web系统中采用jetty+continuation长连接的方式来处理聊天信息发送,现在要在手机应用中加入即时消息发送的功能,采用这个处理方式基本上不怎么好。于是,就通过openfire来处理消息交互,但是...

溜子冲的根 ⋅ 2013/08/27 ⋅ 2

开源Servlet容器 Jetty 7.0 正式版发布

Jetty 7.0宣告发布,人们可由位于Eclipse.org上的新主页或通过Maven Repository下载。该版本不仅代表了Jetty 6.0的一次演变,而且还代表了代码库的重大调整和诸多性能改进。 InfoQ曾在今年早...

红薯 ⋅ 2009/10/15 ⋅ 0

CXF发布webservice

CXF 是两个框架集合,基于XFire. 下载地址http://cxf.apache.org/download.html 我使用的是3.0version 如果javaPorject工程需要引入以下jar cxf-core-3.0.0-milestone2.jar geronimo-servle...

wsl_Mr ⋅ 2014/04/09 ⋅ 2

通过maven打造一个可执行war包问题

@jfinal Hi 我目前尝试通过 java -jar app.war 便捷启动项目, 我使用的jfinal 内置jetty服务,通过maven构建打成war,其配置文件如下: org.apache.maven.pluginsmaven-war-plugintrue...

郭恩洲_OSC博客 ⋅ 2016/04/06 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部