首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

反向 Ajax,第 4 部分 Atmosphere 和 CometD(2)

反向 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.xml
1
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 ChatService
1
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 的一些重要特性,其中包括 :
  • 依赖注入
  • 生命周期管理
  • 全局信道配置
  • 安全管理
  • 消息转换(在所有消息前添加用户名)
  • 会话管理
返回列表