当前位置: 首页 > 工具软件 > Grizzly > 使用案例 >

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 
 类似资料: