Grizzly和comet介绍(译)
傅博瀚
2023-12-01
感觉不是什么新技术,也不是什么新创意,可是一旦用起来可能对技术的影响不小,客户端如果使用长连接的话事情就少多了。原文格式的PDF,看了一下,感觉可以,就译了过来。
原文的标题是Implementing Asynchronous Web Application using Grizzly's Comet
什么是Grizzly?
Grizzly是一个用于构建可信赖的服务应用的通用的NIO框架,它支持中断及非中断socket操作,包括普通或SSL连接,其扩展当前由Sun的几个内部项目(Alaska,GlassFish,Tango等),以及外部项目(Jetty6.1)使用。V2版本将目标定于GlassFish9.1,并将由ORB,MQ使用,也可能包括JAX-WS。
Comet:
一种编程技术,可以使web服务器在客户端不必发送任何请求的情况下发送数据到客户端,它允许创建驻留于浏览器的事件驱动的web应用。
Comet应用与传统应用的区别如下:
http://alex.dojotoolkit.org/?p=545
基本上,它们都使用长期存活的HTTP连接以减少传递给服务器的消息的延迟。
在实质上,他们都不会偶尔轮询服务器,取而代之是服务器具有一条开放的通讯线路,并且可以使用该线路将数据推入客户端。
Comet应用程序可以在任何时候将数据交付至客户端,而不是只响应用户输入。数据由单条,预先开启的连接交付。该方法极大减少了数据交付的延迟。
Grizzly内部的Commet支持细节:
在Grizzly异步请求处理扩展(Grizzly Asynchronous Request Processing extension)之上实现。
隐藏了NIO/Asynchronous Request Processing的复杂性
支持clean以及ssl连接
对JSF,JSP,Servlet,POJO,Javascript(Phobos)可用。
主要目的:简化它!
Grizzly Comet:定义
CometContext:可共享的“空间”,应用可以订购它,之后在上下文更新时被更新。
CometEvent:一个持有Coment Context(内容更新,客户端连接/断开之类)的状态的对象。
CometHandler:一个应用程序为成了一个或几个ComentContext的成员必须实现的接口。
流程:
首先,应用创建一个新的Comet上下文。
将你的Comet request handler加入到该上下文中,通常一个连接创建一个handler。
客户端开放单条连接至一个可共享的上下文。
当一个客户端推送数据时,所有其它的客户端都被更新。
当上下文改变时,客户端都被更新。
实现Comet:四个简单步骤
为一个已有应用加入Comet支持很简单(不需要大规模重构)。
下面四个步聚将描述怎么加入支持
更多细节可以在第二部分找到
首先,注册到一个新的或是已有的Comet context。该context通常使用一个context路径创建(但不是必须的)。
CometEngine cometEngine=CometEngine.getEngine();
CometContext context=cometEngine.register(contextPath);
实现Comet handler接口:
public void attach(E attachment);
public void onEvent(CometEvent event);
public void onInitialize(CometEvent event);
public void onTerminate(CometEvent event);
public void onInterrupt(CometEvent event);
将Comet handler加入到上下文中
下一步,初始化Comet request handler并将其加入到context
MyCometHandler handler = new MyCometHandler();
cometContext.addCometHandler(handler);
广告变更
一旦Comet handler被加入到context,你就可以开始发布事件了,你可以注意到当客户端推送数据或当一些外部事物发生变化时context的情况(如数据库)。
cometContext.notify("Comet is cool");
Comet handler示例
对于一个Servlet,大多数情况下你会使用HttpServletResponse来实现CometHandler:
public class CometResponseHandler implements
CometHandler{
public void attach(HttpServletResponse
httpServletResponse){
this.httpServletResponse =
httpServletResponse;
且onEvent方法大部分情况下看起来是这样的:
public void onEvent(CometEvent event) throws IOException{
try{
PrintWriter printWriter = httpServletResponse.getWriter();
printWriter.println(event.attachment());
printWriter.flush();
} catch (Throwable t){
t.printStackTrace();
}
下一步做什么呢?
构建一个应用程序可重用的handler集合:
一个针对Servlet/Jsp/JSF
一个针对Phobos
一个针对POJO
构建一个针对AJAX|JMaki的可重用客户端组件。
加入comet支持
(由一个叫Bayeux的协议,javascript库(dojo工具箱),以及一个事件服务器(Grizzly)组成),当前一个外部小组正在开发它。
下面都是废话,贴些有用的地址。
此文的参考文献:
[1]http://weblogs.java.net/blog/jfarcand/archive/2006/02/grizzly_pa
rt_ii.html
? [2]http://weblogs.java.net/blog/jfarcand/archive/2006/07/the_grizzly_com.html