JAVA网页设计Web哀求异步处置下降使用依附风险仓酷云
Java的桌面程序开发在java程序员里通常叫swing开发,主要用的swing包里的类开发的,也就是通常说的c/s架构开发成绩凸现年关到了,商家忙着促销,网站忙着推行,阿里软件的服务集成平台也面对第一次多方年夜范围的压力磨练。依据该平台5.3版本的压力测试了局,我们预算了一下现有的推行会带来的压力,基础上断定了服务集成平台岁尾不必要扩容。SA(SystemAdministrator,体系办理员)为了保险起见仍是经由过程哀求体例来做准时的心跳检测,包管服务集成平台的牢靠性。了局阿里旺旺推行入手下手的第一天,SA的报警短信就在几个忙时段一直地发告警,可是检察临盆情况的服务器情况和使用情况后看不出有甚么成绩,因而入手下手嫌疑是不是告警机制不是很公道。几日的会见纪录统计呈报看过今后,发明了几个成绩,起首因为推行是在IM登录时段会合式的推行,因而岑岭期对照会合,压力也很年夜,而告警产生的时候也是那些时分;别的发明那些推行利用的API的处置工夫对照长,同时另有些呈现了成绩,这几天除服务集成平台告警之外,那些API服务器也在告警;因而能够看出成绩应当是因为API供应商呼应速率慢而拖累了服务集成平台的处置才能,监控机制在岑岭情形下没有失掉实时的呼应,就以为是服务器已处于有效形态。
实在这类成绩在我们如今的使用系统架构中经常呈现,缘故原由是如今很少再有地道“关闭式”使用,对数据库的依附,对存储的依附,对第三方体系的依附等等。这也让我回想到在前一阵子列入的平安集会中,腾迅的平安手艺团队的卖力人说平安如今最年夜的成绩就在于互助的第三方的平安不受控而激发的平安潜伏影响。Web使用何尝不是,从最基础的事件处置要小粒度,不要在事件中包括第三方依附,到心跳检测,容错计划的制订等,都已让我们对这方面的成绩有所注重。可是常常这类成绩不是部分计划能够看到的,假如没有一个整体架构计划者关于全局的掌控、和谐和提防,那末成绩呈现而且带来的影响将会很年夜。
<br>
夙昔关于服务集成平台的压力测试次要是在ISP服务“基础一般”的情形下做的,可是此次成绩的表露就请求我们在第三方依附呈现界限成绩时,实时做出一些措施大概改善计划。
成绩剖析和办理计划
成绩缘故原由:
[*]Http哀求处置的堵塞体例。
[*]后端服务处置工夫太长,服务质量不不乱。
[*]WebContainer承受哀求线程资本无限。
办理计划:
[*]改堵塞体例为非堵塞体例来处置哀求。
[*]设置后端超不时间,自动断开毗连,接纳资本。
[*]修正容器设置,增添线程池巨细和守候行列长度。
办理计划一是最难做到的,前面的篇幅将形貌关于这方面手艺的探究。
办理计划二对照简单,同意各个ISP设置本人API允许的最年夜超不时间。
办理计划三Tomcat和JBoss在Connector中有两个参数设置(maxThreads和acceptCount)能够做调剂。
第一个计划实在和JDK1.5撑持的NIO是一种设法,只是我们在Socket中都已接纳过了,而在Http哀求处置中由于要依附于WebContainer开辟商的完成,以是至今还没有被普遍使用,不外在开源社区已有效Mina完成的Http协定处置的框架。必要注重的是,如今Web使用关于Web哀求高效处置的需求仅仅是很小的一方面,实在另有良多相似于平安、缓存、监控等等附加功效也占有着很主要的位置。
Servlet3标准经由快一年的推行,已被各年夜WebContainer厂商所承受,Tomcat6、JBoss5、Jetty7都传播鼓吹本人对Servlet3作了较好的撑持,而在Servlet3中最广为存眷的一个特征就是异步服务处置Servlet(AsyncServlet),这点也是办理我今朝面对成绩的最妙手段。
Servlet3与服务异步处置
Servlet3次要的新特征分红四部分:内嵌式的利用形式、Annotation的撑持、AsyncServlet的撑持和平安提拔。内嵌式的利用很早就在Jetty中被完成,同样成为Jetty的上风之一,Annotation也只能说是如虎添翼的部分,而平安临时没有怎样用到,以是最体贴的仍是AsyncServlet部分。AsyncServlet究竟是甚么样的观点,这里就大抵形貌一下在Servlet3标准中对它的先容:
[*]撑持Comet(彗星)。最初期的Http哀求就是无形态的哀求和呼应,一切的数据一次性在哀求后前往给客户端由客户端衬着。厥后开展到AJAX,页面的哀求和衬着由全局酿成下场部。而Comet合适事务驱动的Web使用和对交互性和及时性请求很强的使用,经由过程创建客户端和服务真个长毗连通道,在一次哀求后能够自动推送服务端数据的变动情形到客户端。长毗连创建的战略有两种:HttpStreaming和HttpLongPolling。前者客户端翻开一个单一的与服务器真个HTTP耐久毗连。服务器经由过程此毗连把数据发送过去,客户端对它们举行增量处置。后者由客户端向服务器端收回哀求并翻开一个毗连。这个毗连只要在收到服务器真个数据以后才会封闭。服务器端发送完数据以后,就当即封闭毗连。客户端则即刻再翻开一个新的毗连,守候下一次的数据。
[*]撑持Suspendingarequest。经由过程在ServletRequest中增添suspend,resume,complete等,其将Http哀求处置的block形式变化成为notblock形式,同时撑持关于形态的查询(suspend,resume,timeout)。
[*]哀求处置过程当中撑持事务机制。呼应也撑持形态查询。
<br>
图异步服务哀求基础流程
实际中的异步服务处置
Tomcat的异步服务处置
这里利用的是Tomcat6.0.14版本。在Tomcat中关于异步处置形貌在AdvancedIO中作了申明,次要分红两部分:Comet的撑持和异步输入。
Comet的撑持感化分红两部分:哀求读数据的非堵塞,呼应处置的异步实行。前者能够避免在年夜流量数据上传过程当中,信道余暇守候的资本华侈,后者用于在处置哀求时,依附于第三方大概自己处置对照耗时的情形下,吊挂起哀求处置线程,进步哀求处置才能,完成处置后异步输入了局。
Servlet不再是本来关于几个尺度的Http哀求范例的办法完成,而是关于事务呼应的处置。Comet界说了4个基本的事务:
[*]EventType.BEGIN:客户端创建起毗连时引发的事务,能够用于资本初始化。
[*]EventType.READ:无数据能够被读进的事务。(熟习NIO的事务形式应当能够懂得)
[*]EventType.END:哀求处置停止时引发的事务,能够用于资本清算。
[*]EventType.ERROR:当哀求处置呈现成绩时引发的事务。(IO非常,超时等)
另有一些子事务范例,比方超时就属于ERROR的子事务范例,能够在事务处置中加倍准确地定位事务范例。
必须的设置:在server.xml中设置以下(白色部分):
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443"/>实践代码典范以下:
//CometProcessor接口必须被完成,一旦完成今后,则该Servlet在设置好今后不会再挪用service,get,post等办法的完成。publicclassSIPCometTomcatServletextendsHttpServletimplementsCometProcessor{@Override//事务处置呼应办法完成publicvoidevent(CometEventevent)throwsIOException,ServletException{if(event.getEventType()==CometEvent.EventType.BEGIN){//设置事务超不时间event.setTimeout(10*1000);//另起线程处置背景事情,异步前往了局,事务呼应将不守候背景处置间接前往newHandler(event.getHttpServletRequest(),event.getHttpServletResponse()).start();}elseif(event.getEventType()==CometEvent.EventType.ERROR){//停止事务,接纳request,response资本event.close();}elseif(event.getEventType()==CometEvent.EventType.END){event.close();}}//另起一个线程异步处置哀求。classHandlerextendsjava.lang.Thread{privateHttpServletResponseresponse;privateHttpServletRequestrequest;publicHandler(HttpServletRequestrequest,HttpServletResponseresponse){this.response=response;this.request=request;}@Overridepublicvoidrun(){try{Stringid;id=request.getParameter("id");if(id==null)id="noid";Thread.sleep(5000);PrintWriterpw=response.getWriter();pw.write(id);pw.flush();}catch(Exceptione){e.printStackTrace();}}}}利用过程当中的一些总结:
[*]事务呼应框架将服务的哀求由完全的一次服务处置切割成为细粒度的多事务处置,为哀求多阶段并行处置供应了框架基本。
[*]Event对象在事务处置办法停止后就被接纳了,可是request和response在事务处置完今后还能够持续利用,因而能够看出本来的堵塞式的体例已能够经由过程事务的切分红为非堵塞的体例。
[*]没有供应Servlet3中形貌的suspend,resume,complete办法,没法自动把持request的异步处置。下面的代码能够看出我只利用了Begin办法启动了一个线程,可是因为没法自动地停止哀求,因而在向客户端前往数据今后还要比及超时才会停止此次会话。(看了Tomcat的代码,也想仿照close的举措可是因为它利用了protected没法猎取封装的request对象,因而没法开释资本)。固然也能够经由过程客户端共同,由客户端自动倡议再次的数据传输引发READ事务来停止会话。这么做对客户真个依附对照强,同时也增添了客户真个处置庞大度。
[*]Tomcat撑持异步输入:在APR大概NIO的形式下,Tomcat撑持在体系压力增年夜的时分,撑持异步回写年夜文件数据。
整体下去说完成了部分关于Comet的撑持,可是没有对异步服务流程作很好的撑持,没法在开辟中利用(复杂顺畅的利用)。
JBoss的异步服务处置
JBoss4.2.3版本设置和利用与Tomcat6相似,没有甚么差别。
JBoss5方才公布了RC版本,关于异步服务处置作了很年夜的修改,与Tomcat设置很分歧,这里详细的说一下JBoss5中的异步服务利用。
JBoss5已将Tomcat中的Http11NioProtocol给删除,取而代之的是JBoss本人servlet包内增添的一个HttpEventServlet接口,这个接口和Tomcat的CometProcessor相似。
起首,必需设置JBoss内置的Web容器为APR形式,也就是设置jbossweb.sar上面的server.xml中Connector以下:
<Connectorprotocol="org.apache.coyote.http11.Http11AprProtocol"port="8080"address="${jboss.bind.address}"connectionTimeout="2000"redirectPort="8443"/>其次异步服务处置的Servlet必需完成HttpEventServlet接口,接口只要一个办法,就是事务处置办法:publicvoidevent(HttpEventevent)。事务界说与Tomcat稍有分歧,在BEGIN,ERROR,READ,END基本上增添了TIMEOUT,EOF,EVENT,WRITE四个事务,同时往失落了SubType。
[*]TIMEOUT实际上是从本来的Error的SubType分别出来的,这个办法是在最初一次处置事务到以后工夫凌驾设定的超不时间而被引发的,同时TIMEOUT被引发其实不会封闭哀求处置流程,必需显现挪用事务的close办法才会停止会话。
[*]EOF事务将会在客户端自动断连的情形下被触发,就比如IE窗口在哀求过程当中被封闭就会被触发。
[*]EVENT事务在事务对象被挪用resume的时分被引发,依照原意应当最好能够附带上一些自界说信息来做一些事情,可是我本人利用过程当中还没有发明有甚么好的举措能够在事务中附带信息到事务处置中。
[*]WRITE办法在挪用isWriteReady办法时被引发,能够在收集呈现成绩大概忙碌的时分异步守候输入。
再则,JBoss的事务对象还撑持几个办法来完成异步处置和Comet机制,办法以下:
[*]close办法:暗示一次哀求处置的停止,会告诉客户端没无数据前往了,同时也会引发END事务。
[*]setTimeout办法:设置毗连超不时间(单元毫秒),盘算超时是从比来的事务处置工夫入手下手纪录的,假如产生超时,则会引发TIMEOUT事务。
[*]isReadReady办法:假如毗连无数据能够读取则前往true,假如这个办法前往false,servlet还试图往读往数据,则会堵塞。
[*]isWriteReady办法:假如前往true,则毗连能够无堵塞的写出数据,假如前往false,servlet必需中断写数据,假如强迫写出,则大概会产生IO毛病大概会接纳异步输入。当客户真个输入通道可用今后,则会引发write事务。
[*]suspend办法:suspend毗连处置线程直到timeout产生大概resume被挪用,实践上意味着servlet在suspend今后不再收到READ事务,READ事务将会在背景被不休的引发,除非被suspend.
[*]resume办法:会引发event事务,能够使用这个办法来停止异步处置。同时也能够激活由于suspend中断的read事务,同时也能够在resume今后再挪用suspend办法。注重,这里一定是请求必需先suspend今后再resume。
[*]event,request,response在事务呼应过程当中都能够被利用,可是线程不平安,同时在挪用了close今后,request,response资本会被开释,能够经由过程对event对象做同步来包管线程平安的成绩。当READ事务和END事务都产生的时分,起首会完成READ事务,然后再往完成END。
详细的完成代码以下:
publicclassSIPCometJBossServletextendsHttpServletimplementsHttpEventServlet{@Overridepublicvoidevent(HttpEventevent)throwsIOException,ServletException{switch(event.getType()){//willbecalledatthebeginningoftheprocessingoftheconnectioncaseBEGIN:{event.setTimeout(100*1000);//设置超不时间//event.suspend();//resume之前不用要必定利用suspendnewHandler(event).start();break;}//Errorwillbecalledbythecontainerinthecase//whereanIOexceptionorasimilarunrecoverableerroroccurscaseERROR:{event.close();break;}//EndmaybecalledtoendtheprocessingoftherequestcaseEND:{//event.close();//能够写也能够不写,由于进进这个办法也就是挪用了close办法,最少临时还不晓得有其他甚么出口break;}//Thisindicatesthatinputdataisavailable,//andthatatleastonereadcallcanbemadewithoutblockingcaseREAD:{break;}//Theconnectiontimedoutaccordingtothetimeoutvaluewhichhasbeenset//,buttheconnectionwillnotbeclosedunlesstheservletusestheclosemethodoftheeventcaseTIMEOUT:{event.close();//假如不自动封闭,Timeout办法会被轮回挪用,会话不会停止break;}//Theendoffileoftheinputhasbeenreached,andnofurtherdataisavailablecaseEOF:{event.close();break;}//Eventwillbecalledbythecontaineraftertheresume()methodiscalled,//duringwhichanyoperationcanbeperformed,includingclosingtheconnectionusingtheclose()method.caseEVENT:{event.close();//作为resume办法挪用后自动开释毗连资本的一种手腕break;}//WriteissentiftheservletisusingtheisWriteReadymethodcaseWRITE:{break;}}}classHandlerextendsjava.lang.Thread{privateHttpEventevent;//event的性命周期已不限定于事务处置办法,因而随时能够封闭哀求处置privateHttpServletResponseresponse;privateHttpServletRequestrequest;publicHandler(HttpEventevent){this.event=event;this.response=event.getHttpServletResponse();this.request=event.getHttpServletRequest();}@Overridepublicvoidrun(){try{Stringid;id=request.getParameter("id");if(id==null)id="noid";Thread.sleep(5000);//伤害!!!实在event,response,request都是线程不平安的,因而此时大概response已被开释,必要同步住event的对象来操纵,效力大概会下降PrintWriterpw=response.getWriter();pw.write(id);pw.flush();event.resume();//发送停止挪用resume办法,进进event办法,停止哀求处置}catch(Exceptione){e.printStackTrace();}}}}利用总结:
[*]关于Servlet形貌的异步服务处置有了较好的撑持。
[*]事务办法对照丰厚,可是关于可界说事务撑持不敷完美。
[*]对象并发把持必要开辟者本人计划,衡量多线程处置的高效和资本争取的损耗。
上面对异步服务处置Servlet和一般Servlet做了一下复杂的功能测试。
起首我底本想用ab来做一下复杂的压力测试便可,可是ab仿佛关于apr形式下的测试撑持的欠好,一压就报错(apr_poll:Thetimeoutspecifiedhasexpired(70007)),也多是本人不会用吧,因而就本人写了一段测试代码来做测试。
测试场景以下:
两类Servlet都能够设置处置时Hold的工夫,来到达损耗毗连数的目标。测试客户端能够设置并发几用户,每一个用户倡议几次哀求。下表就是测试的了局:
这里设置的是Servlet都hold1秒钟,APR启动时设置的最年夜毗连数为默许的200个。
客户端设置一般Servlet总耗时(ms)异步Servlet总耗时(ms)一般Servlet单个线程耗时(ms)异步Servlet单个线程耗时(ms)100并发线程,每一个线程实行1次哀求26386627443026382744300并发线程,每一个线程实行1次哀求55071861708218352056100并发线程,每一个线程实行10次哀求108774712079201087712079300并发线程,每一个线程实行10次哀求retryingrequest,connectreject5193644retryingrequest,connectreject17312
从上表能够看出,就地道从处置效力来讲,接纳事务处置体例在线程切换过程当中存在着必定的丧失,可是就我们利用异步哀求处置的本意来看,关于在高并发下对后端依附没法制止的功能消耗情形下,异步哀求办理了毗连耗尽的成绩。
最初再来看我在测试过程当中用JProfiler来截取的一些线程创立和利用情况:
<br>
上图是最后的线程创立情形,还没有任何哀求被发送到服务端,因而线程池也没有开任何一个毗连。
<br>
这是一般的Servlet在压力测试下的线程情况,线程就开到了200最年夜值,图中因为程序来Hold哀求处置线程呈现了白色堵塞和黄色守候,同时客户端已入手下手呈现回绝毗连的毛病。下图就是毛病的截图:
<br>
<br>
上图是异步服务处置Servlet在压力测试入手下手的情形,能够发明它的http线程仍是200,可是其他事务处置线程在不休增加。下图已增加到了3000多个线程。(这里必要注重的就是这类异步处置资本请求没有设置下限,因而关于资本损耗来讲也是对照年夜的,同时要提防打击性哀求形成服务端垮失落)。
<br>
<br>
结语
多线程、散布式盘算、Erlang等这些编程体例、框架计划、言语实在都在完成这一个实际,那就是分而治之,多线程是站在单使用的角度往思索办理计划,散布式盘算是在多机合作思索办理计划,Erlang在单机多处置器的角度往思索办理计划。但相互的理念都是一样,将可以支解的不相干联的自力义务并行处置,终极完成最优化的处置效果。
关于服务集成平台是不是接纳这类手艺,我本人还没有终极的决意,起首就如下面的测试了局来看,有得仍是有掉的,其次这类并发异步处置带来的多线程保护把持庞大度,也必要思索到本钱中。Jetty的开辟者关于是不是将异步服务处置Servlet来交由开辟者把持而不是容器自己来把持暗示出了否决定见,切实其实,如许庞大的把持交给开辟者来处置会增添开辟者的进修本钱和保护本钱。
作者先容:岑文初,就任于阿里软件公司研发中央平台一部,任架构师。以后次要事情触及阿里软件开辟平台服务框架(ASF)计划与完成,服务集成平台(SIP)计划与完成。没有甚么善于大概精晓,事情到如今独一提拔的就是进修才能和速率。团体Blog为:http://blog.csdn.net/cenwenchu79。
本文出自:http://www.infoq.com/cn/articles/request-asyn-risk-reduce
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 是一种使用者不需花费很多时间学习的语言 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
页:
[1]
2