首页 > 其他分享 >Servlet3.0新功能: 异步处理

Servlet3.0新功能: 异步处理

时间:2023-06-04 14:36:32浏览次数:40  
标签:异步 Servlet3.0 HTTP Thread Request 功能 Server Client 连接



2EE 6和Glassfish 3V正式发布了,J2EE 6正式发布了Servlet3.0, 为了能更好的对WEB2.0提供支持, 3.0添加了异步处理的机制.

HTTP1.1相对于HTTP1.0的影响 .

HTTP1.1最大的一个改变就是提供了长连接,这样HTTP不再是一次请求,一次连接的协议了,只要HTTP的connection不关闭,一次HTTP连接可以支持任意多次request/reponse处理. 当WEB Client与WEB Server建立连接时,客户端可以采用长连接,也就是说Client会一直保持对WEB Server的连接(例如:Browser对一个网站保持当连接,知道Browser关闭或最终退出该网站). 旧的WEB Server会为每一个Http连接分配一个active的Thread,这样当Client的数量增大时,Server端Thread Pool的最大容量也需要相应增大,但Thread是相当耗内存的,一个不小心就会导致Server端NotEnoughMemory...

基于HTTP1.1,大部分支持Servlet2.X的WEB容器都采用的NIO去接收和处理请求. 当Client和Server端建立连接时,Server端并不分配一个Thread给HTTP连接.直到Server端收到Client端发送的Request时, Server才开始为该Request分配Thread(注意:这里不是为HTTP连接分配Thread ).

这样当大量的Client建立长连接与Server进行交互时,Server无需维持一个Thread给inactive的HTTP长连接, 每个Servlet在doReceived()时其实对应的是一个active Request,而不是HTTPConnection本身. 这样Server端所需的最大Thread数大大地减少了.

AJAX的影响

1. Request的数量爆炸性增加增加

过去WEB Browser打开一个Web page,只需要和Web Server端建立一个HTTP连接.但AJAX技术出现以后,一个Web page上可能有多个与Web Server的连接,而且Ajax request通常是十分频繁的,Server接收到的Request数量大大增长了, 这样原先NIO的技术已经不能很好的支持基于Ajax的服务了.

Servlet 3.0的异步处理就能够解决上面的问题.

Servlet3.0的solution:
当request发送到Server端时,servlet的doReceived()将request放进一个queue里,然后doReceived结束.这个时候server并没有关闭response,Client端一直在等server端response的内容. Server端维护自己的ThreadPool,当ThreadPool里有idle的Thread,就从queue里取出一个request,分配idle的Thread给request,并进行处理.

@WebServlet("/test" asyncSupported=true)
   public class MyServlet extends HttpServlet {
       ScheduledThreadPoolExecutor executor = null;

        public void init(ServletConfig arg0) throws ServletException {
                   executor = new ThreadPoolExecutor(10);//独立的线程池处理请求
        }
        public void doGet(HttpServletRequest req, HttpServletResponse res) {
            ...
            AsyncContext aCtx = request.startAsync(req, res);
            executor.execute(new AsyncWebService(aCtx));//异步处理
        }
   }

   public class AsyncWebService implements Runnable {
        AsyncContext ctx;
        public AsyncWebService(AsyncContext ctx) {
            this.ctx = ctx;
        }
        public void run() {//处理请求
            //Do something here ...

            // Dispatch the request to render the result to a JSP.
            ctx.dispatch("/render.jsp");
   }
}




以上的例子可以用于处理对Ajax的请求,因为通常Ajax的请求多,但对响应速度的要求并不太高. 对于正常的页面请求,要求一定的响应速度,可以沿用以前Servlet同步的实现.



2. Server端推送信息


在Web2.0的应用中, Ajax可用通过不断的发送Request来获取Server端某种信息的变化,但这种实现会产生大量的Client请求. 当前推荐的方法是,让Server端自己推送信息变化给Client.



因为Servlet3.0提供了异步处理的方式, Request提交给Server以后, Server可以为Request注册一个Listener,由Listener去monitor信息的变化,当信息发生变化时,由Listener负责把信息变化发送给Cient(Listener关闭HTTP response).


标签:异步,Servlet3.0,HTTP,Thread,Request,功能,Server,Client,连接
From: https://blog.51cto.com/u_3871599/6410570

相关文章

  • dbeaver 23启用从编程语言源码中提取SQL功能
    一直很喜欢dbeaver的一个自动提取剪切板SQL功能,该功能去除多余C#/Java中SQL字符串加号和双引号.但升级到dbeaver23之后,发现该功能默认被关闭了,开启功能见下图:......
  • 既然 WebSocket 支持双向通信,功能看似比 HTTP 强大,那么我们是不是可以基于 WebSocket
    答:1.HTTP协议稳定易实现,大部分Web开发后台都没有主动发送数据给前端的需求2.WebSocket协议相对复杂,维护长连接也需要增加服务器资源开销,还要处理连接端开后重连问题因此,WebSocket并不能取代HTTP,它只适合在高实时的场景,需要服务器给客户端主动推......
  • Async异步注解
    @RestController@Slf4jpublicclassThread04{@AutowiredprivateOrderManageorderManage;@GetMapping("addOrder")publicStringaddOrder(){log.info("1");//异步处理orderManage.asyncLog();......
  • 案例补充:简易版本的注册功能
    案例补充:简易版本的注册功能#注册登录1.简易版本的注册功能 #把用户的用户名和密码保存到我们的数据文件中要求:'kevin|123'把用户的用户名和密码组织成你自己喜欢的格式保存到文件中#1.接收用户名和密码username=input('username>>>......
  • 案例补充:进阶版本的多用户注册等了功能
    案例补充:进阶版本的多用户注册等了功能1.支持多用户注册'''快捷键:tab缩进,shift+tab反向缩进''''''多用户注册'''whileTrue:#1.接收用户名和密码username=input('username>>>:')password=input('passwor......
  • 【React工作记录八十六】React+Hook+ts+antDesignMobile实现input自动获取功能
    前言大家好我是歌谣今天继续处理工作遇到的问题目前要做的问题是移动端需要做一个进入页面获取焦点的功能实现演示核心代码input上面绑定refs<InputonChange={handleChange}ref={inputRef}placeholder="请输入条形编码或者扫码录入"/>定义状态constinputRef:any=useRef(nul......
  • Apache Hudi 1.x 版本重磅功能展望与讨论
    ApacheHudi社区正在对ApacheHudi1.x版本功能进行讨论,欢迎感兴趣同学参与讨论,PR链接:https://github.com/apache/hudi/pull/8679/files摘要此RFC提议对Hudi中的事务数据库层进行令人兴奋和强大的重构,以推动未来几年整个社区的持续创新。在过去的几年里,社区成长(https://g......
  • 通过DSL实现Elasticsearch数据排序功能
    普通字段排序语法:点击查看代码GET /indexName/_search{  "query": {    "match_all": {}  },  "sort": [    {      "FIELD": "desc"  // 排序字段、排序方式ASC、DESC    }  ]}示例:点击查看代码GET/hotel/_search{"q......
  • 通过DSL实现Elasticsearch数据搜索功能
    DSL查询分类查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(fulltext)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:match_querymulti_match_query精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:i......
  • 基于SqlSugar的开发框架循序渐进介绍(30)-- 整合客户关系管理系统模块功能
    以前在随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示 》的几篇随笔中介绍过基于WInform开发框架开发的CRM系统,系统的功能主要也是围绕着客户相关信息来进行管理的,经过一些客户的定制应用,以及框架各种功能的完善,系统也已经很完善了,不过不同的CRM侧重......