仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 758|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA网页编程之利用异步Servlet改善使用功能仓酷云

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)NikitaSalnikovTarnovski是plumbr的初级开辟者,也是一名使用功能调优的专家,他具有多年的功能调优履历。克日,Tarnovski撰文谈到了怎样经由过程异步Servlet来改善罕见的JavaWeb使用的功能成绩。
尽人皆知,Servlet3.0尺度已公布了很长一段工夫,相较于之前的2.5版的尺度,新尺度增添了良多特征,好比说以注解情势设置Servlet、web.xml片断、异步处置撑持、文件上传撑持等。固然说如今的良多JavaWeb项目其实不会间接利用Servlet举行开辟,而是经由过程如SpringMVC、Struts2等框架来完成,不外这些JavaWeb框架实质上仍是基于传统的JSP与Servlet举行计划的,因而Servlet仍然是最基本、最主要的尺度和组件。在Servlet3.0尺度新增的诸多特征中,异步处置撑持是令开辟者最为存眷的一个特征,本文就将具体对照传统的Servlet与异步Servlet在开辟上、利用上、和终极完成上的不同,剖析异步Servlet为什么会提拔JavaWeb使用的功能。
本文次要先容的是可以办理古代Web使用罕见功能成绩的一种功能优化手艺。现今的使用已不单单是主动地守候扫瞄器来倡议哀求,而是由使用本身倡议通讯。典范的示例有谈天使用、拍卖体系等等,实践情形是年夜多半工夫与扫瞄器的毗连都是余暇的,守候着某个事务来触发。
这类范例的使用本身存在着一个成绩,出格是在高负载的情形下成绩会变得更加严峻。典范的症状有线程饥饿、影响用户交互等等。依据近一段工夫的履历,我以为能够经由过程一种绝对对照复杂的计划来办理这个成绩。在ServletAPI3.0完成成为支流后,办理计划就变得加倍复杂、尺度化且文雅了。
在入手下手先容办理计划前,我们应当更深切地舆解成绩的细节。另有甚么比看源代码更间接的呢,上面就来看看上面这段代码:
@WebServlet(urlPatterns="/BlockingServlet")
publicclassBlockingServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
try{
longstart=System.currentTimeMillis();
Thread.sleep(2000);
Stringname=Thread.currentThread().getName();
longduration=System.currentTimeMillis()-start;
response.getWriter().printf("Thread%scompletedthetaskin%dms.",name,duration);
}catch(Exceptione){
thrownewRuntimeException(e.getMessage(),e);
}
}
下面这个Servlet次要完成以下事变:
哀求抵达,暗示入手下手监控某些事务。
线程被堵塞,直到事务产生为止。
在吸收到事务后,编纂呼应然后将其发还给客户端。
为了简化,代码中将守候部分交换为一个Thread.sleep()挪用。
如今,你大概会以为这就是一个挺不错的Servlet。在良多情形下,你的了解都是准确的,上述代码并没有甚么成绩,不外当使用的负载变年夜后就不是这么回事了。
为了摹拟负载,我经由过程JMeter创立了一个复杂的测试,我会启动2,000个线程,每一个线程运转10次,每次城市向/BlockedServlet这个地点收回哀求。将这个Servlet部署在Tomcat7.0.42中然后运转测试,失掉以下了局:
均匀呼应工夫:19,324ms
最快呼应工夫:2,000ms
最慢呼应工夫:21,869ms
吞吐量:97个哀求/秒
默许的Tomcat设置有200个事情线程,别的再加上摹拟的事情由2,000ms的就寝工夫来暗示,这就可以对照好地注释最快与最慢的呼应工夫了,每一个线程城市就寝2秒钟。再加上高低文切换的价值,因而97个哀求/秒的吞吐量基础上是切合我们的预期的。
关于尽年夜多半的使用来讲,这个吞吐量还算是能够承受的。重点来看看最慢的呼应工夫与均匀呼应工夫,成绩就变得有些严峻了。经由20秒而不是等候的2秒才干失掉呼应明显会让用户感应十分不爽。
上面我们来看看别的一种完成,使用ServletAPI3.0的异步撑持:
@WebServlet(asyncSupported=true,value="/AsyncServlet")
publicclassAsyncServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
Work.add(request.startAsync());
}
}
publicclassWorkimplementsServletContextListener{
privatestaticfinalBlockingQueuequeue=newLinkedBlockingQueue();
privatevolatileThreadthread;
publicstaticvoidadd(AsyncContextc){
queue.add(c);
}
@Override
publicvoidcontextInitialized(ServletContextEventservletContextEvent){
thread=newThread(newRunnable(){
@Override
publicvoidrun(){
while(true){
try{
Thread.sleep(2000);
AsyncContextcontext;
while((context=queue.poll())!=null){
try{
ServletResponseresponse=context.getResponse();
response.setContentType("text/plain");
PrintWriterout=response.getWriter();
out.printf("Thread%scompletedthetask",Thread.currentThread().getName());
out.flush();
}catch(Exceptione){
thrownewRuntimeException(e.getMessage(),e);
}finally{
context.complete();
}
}
}catch(InterruptedExceptione){
return;
}
}
}
});
thread.start();
}
@Override
publicvoidcontextDestroyed(ServletContextEventservletContextEvent){
thread.interrupt();
}
}
下面的代码看起来有点庞大,因而在入手下手剖析这个办理计划的细节信息之前,我先来概述一下这个计划:速率上提拔了75倍,吞吐量提拔了20倍。看到这个了局,你一定刻不容缓地想晓得这个示例是怎样做到的吧。
这个Servlet自己长短常复杂的。必要注重两点,起首是声明Servlet撑持异步办法挪用:
@WebServlet(asyncSupported=true,value="/AsyncServlet")
其次,主要的部分实践上是埋没鄙人面这行代码挪用中的。
Work.add(request.startAsync());
全部哀求处置都被托付给了Work类。哀求高低文是经由过程AsyncContext实例来保留的,它持有容器供应的哀求与呼应对象。
如今来看看第2个,也是加倍庞大的类,Work类完成了ServletContextListener接口。出去的哀求会在该完成中列队守候关照,关照多是下面提到的拍卖中的竞标价,或是一切哀求都在守候的群组谈天中的下一条动静。
当关照抵达时,我们这里仍然是经由过程Thread.sleep()让线程就寝2,000ms,行列中一切被堵塞的义务都是由一个事情线程来处置的,该线程卖力编纂与发送呼应。相对堵塞成百上千个线程以守候内部关照,我们经由过程一种加倍复杂且洁净的体例告竣所愿,经由过程批处置在独自的线程中处置哀求。
仍是让了局来讲话吧,测试设置与刚刚的示例一样,仍然利用Tomcat7.0.24的默许设置,测试了局以下所示:
均匀呼应工夫:265ms
最快呼应工夫:6ms
最慢呼应工夫:2,058ms
吞吐量:1,965个哀求/秒
固然说这个示例很复杂,不外关于实践项目来讲经由过程这类体例仍然能取得相似的了局。
在将一切的Servlet改写为异步Servlet前,请允许我多说几句。该办理计划十分合适于某些使用场景,好比说群组关照与拍买价格关照等。不外,关于守候数据库查询完成的哀求来讲,这类体例就没有甚么需要了。像平常一样,我必需得重申一下——请经由过程实行举行器度,而不是瞎猜。
关于那些不合适于这类办理计划的场景来讲,我仍是要说一下这类体例的优点。除在吞吐量与提早方面带来的不言而喻的改善外,这类体例还能够在年夜负载的情形下文雅地制止大概呈现的线程饥饿成绩。

唉!都是钱闹的1.Swing和.net网页编程开发比较------从市场份额看.net网页编程开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具
变相怪杰 该用户已被删除
沙发
发表于 2015-1-25 15:53:35 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再现理想 该用户已被删除
板凳
发表于 2015-2-2 22:39:09 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
admin 该用户已被删除
地板
发表于 2015-2-5 14:33:40 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
兰色精灵 该用户已被删除
5#
发表于 2015-2-9 07:53:13 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
透明 该用户已被删除
6#
发表于 2015-2-19 21:33:48 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
分手快乐 该用户已被删除
7#
 楼主| 发表于 2015-2-24 04:43:20 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
若天明 该用户已被删除
8#
发表于 2015-2-27 06:28:09 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
不帅 该用户已被删除
9#
发表于 2015-3-4 14:44:48 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
山那边是海 该用户已被删除
10#
发表于 2015-3-7 09:54:41 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
愤怒的大鸟 该用户已被删除
11#
发表于 2015-3-14 18:44:07 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
飘飘悠悠 该用户已被删除
12#
发表于 2015-3-21 13:01:45 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 21:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表