反向 Ajax,第 4 部分 Atmosphere 和 CometD(2)
 
- UID
- 1066743
|

反向 Ajax,第 4 部分 Atmosphere 和 CometD(2)
CometD 框架CometD 框架是基于 HTTP 的事件驱动通信解决方案,已面市多年。CometD 框架的第 2 版本中添加了对注释配置和 WebSocket 的支持。CometD 框架提供了一个 Java 服务器部件和一个 Java 客户端部件,还有一个基于 jQuery 和 Dojo 的 JavaScript 客户端库。CometD 使用了一个叫 Bayeux 的标准化通信协议,充许您针对于消息确认、流控制、同步、集群等方面进行扩展。
CometD 的事件驱动方法非常适合事件驱动 Web 开发的新概念。正如传统的桌面用户界面那样,所有的组件均通过总线进行通信,以便发送通知和接收事件。因此所有的通信都是异步的。
CometD 框架:
- 有大量的相关资料。
- 提供了一些示例和 Maven 原型,以促进项目的启动。
- 拥有精心设计的 API,支持扩展开发。
- 提供了一个称为 Oort 的集群模块,该模块使您能够运行多个CometD Web 服务器,将它们看作是负载均衡器背后的集群中的节点,从而扩展许多 HTTP 连接。
- 支持安全策略,允许更具体地配置由谁通过哪条通道发送消息。
- 更好地与 Spring 和 Google Guice(依赖注入框架)集成。
Bayeux 协议Bayeux 通信协议主要是基于 HTTP。它提供了客户端与服务器之间的响应性双向异步通信。Bayeux 协议基于通道进行通信,通过该通道从客户端到服务器、从服务器到客户端或从客户端到客户端(但是是通过服务器)路由和发送消息。Bayeux 是一种 “发布- 订阅” 协议。CometD 实现了 Bayeux 协议,除了 Comet 和 WebSocket 传输协议之外,它还提供了一个抽象层,以便通过 Bayeux 发送请求。
服务器和内部构件 CometD 与三个传输协议绑定在一起:JSON、JSONP 和 WebSocket。他们都依赖于 Jetty Continuations 和 Jetty WebSocket API。在默认情况下,可以在 Jetty 6、Jetty 7、和 Jetty 8 中以及其他所有支持 Servlet 3.0 Specification 的服务中使用 CometD。可以使用与扩展相同的方式添加和开发传输协议。您应该能够编写支持 Grizzly WebSocket API 和其他 API 的传输协议,然后再在配置 CometD 服务器的步骤中添加这些协议。图 2 显示了主要 CometD 数据块的概述。
图 2. CometD 的构架视图 图 2图中没有显示访问消息通道的安全层。
本文提供的 源代码 包括一个使用 CometD 的 Web 应用程序。该 Web 应用程序的描述符包括 清单 4 中的定义,以便使用该聊天示例。
清单 4. web.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <servlet>
<servlet-name>cometd</servlet-name>
<servlet-class>
org.cometd.java.annotation.AnnotationCometdServlet
</servlet-class>
<async-supported>true</async-supported>
[...]
<init-param>
<param-name>services</param-name>
<param-value>ChatService</param-value>
</init-param>
<init-param>
<param-name>transports</param-name>
<param-value>
com.ovea.cometd.websocket.jetty8.Jetty8WebSocketTransport
</param-value>
</init-param>
</servlet>
|
CometD servlet 支持一些控制全局设置的选项,比如能够设置传输协议和服务的选项。在本示例中,假设您想要为 Jetty 8 添加 WebSocket 支持。服务器端的 CometD 服务类 ChatService 会控制每个人说话的聊天室,如 清单 5 中所示:
清单 5. CometD ChatService1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| @Service
public final class ChatService {
@Inject
BayeuxServer server;
@PostConstruct
void init() {
server.addListener(new BayeuxServer.SessionListener() {
@Override
public void sessionAdded(ServerSession session) {
[...]
}
@Override
public void sessionRemoved(ServerSession session, boolean timedout) {
[...]
}
});
}
@Configure("/**")
void any(ConfigurableServerChannel channel) {
channel.addAuthorizer(GrantAuthorizer.GRANT_NONE);
}
@Configure("/chatroom")
void configure(ConfigurableServerChannel channel) {
channel.addAuthorizer(new Authorizer() {
@Override
public Result authorize(
[..] // check that the user is in session
}
});
}
@Listener("/chatroom")
void appendUser(ServerSession remote,
ServerMessage.Mutable message) {
[...]
}
}
|
清单 5 演示了 CometD 的一些重要特性,其中包括 :
- 依赖注入
- 生命周期管理
- 全局信道配置
- 安全管理
- 消息转换(在所有消息前添加用户名)
- 会话管理
|
|
|
|
|
|