Comet为什么使用CometProcessor接口的event函数,如果不用CometProcessor,直接用HttpServlet,在doGet或者doPost方法中对一个守候线程进行操作,不是一样么?
1条回答 默认 最新
- blogzhoubo 2012-10-31 14:33关注
Comet有多种实现方式,你说的方法只是其中的一种实现方法。也就是直接在HttpServlet的doGet或者doPost方法中将response进行阻塞(不返回),直到有消息需要发送的时候再返回,客户端收到结果后再一次请求一个连接过来,周而复始。这种方式基于阻塞式IO,每个连接都要占用一个处理线程,当连结数较多时,WEB服务器的吞吐量就成了一个瓶颈,因为处理线程池的最大数量是有限制的,当线程数达到一定数量后,CPU用于线程调度的时间增多,整体的处理速度会下降。而且这种方式只要有消息需要推送给客户端,本次连接就结束了,之后客户端还要再进行一次新的连接。所以对于小型应用可以使用,但是并发连接数较多的大型应用就会遇到瓶颈。这时就要考虑采用下面这种方式了。
CometProcessor接口的event函数属于另外一种实现方式,这种实现方式基于NIO(非阻塞式IO),采用事件响应的处理方式。在WEB服务器内部会维护一个线程队列,这个队列可以存放足够多的连接以及对应的事件监听信息,监听相当于客户端和servlet之间的一个桥梁,它监听客户端的事件,必要的时候把事件转给servlet,同时它也监听servlet端的事件,必要的时候,它把servlet返回的信息返回给客户端。而且当response给客户端信息结束以后,并不断开连接,而是继续保持连接,所以通过一个连接客户端和servlet之间可以多次传递数据,直到timeout(这个timeout时间可以设置得足够长)或者servlet主动关闭连接,这个连接才会断开。这种方式在不改变处理线程池的最大线程数的前提下,采用队列缓存大量请求,来提高web服务器的吞吐量。同时采用java的nio,使长连接成为可能,服务端可以高效实时地进行消息推送。
这两种方式的区别就在于阻塞式IO和非阻塞式IO。两者都是基于JAVA本身对阻塞式IO和非阻塞式IO的支持。没有JAVA的NIO库的支持,就谈不上基于事件响应的comet的实现。
对于tomcat而言,上面的这两种方式都支持,具体配置及细节可以参考下面的文章。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 shape_predictor_68_face_landmarks.dat
- ¥15 slam rangenet++配置
- ¥15 对于相关问题的求解与代码
- ¥15 ubuntu子系统密码忘记
- ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
- ¥15 保护模式-系统加载-段寄存器
- ¥15 电脑桌面设定一个区域禁止鼠标操作
- ¥15 求NPF226060磁芯的详细资料
- ¥15 使用R语言marginaleffects包进行边际效应图绘制
- ¥20 usb设备兼容性问题