jinshengwuyuan
2012-10-26 11:13
浏览 281
已采纳

Comet为什么使用CometProcessor接口的event函数

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而言,上面的这两种方式都支持,具体配置及细节可以参考下面的文章。

    [url]http://blogzhoubo.iteye.com/admin/blogs/1709212[/url]

    点赞 评论

相关推荐 更多相似问题