Chapter 5. 总体架构

本章对HornetQ的总体技术架构进行了概括描述。

5.1. 核心架构

HornetQ的核心是由一组简单Java对象(POJO)构成的。同时在设计HornetQ时将对外部jar包的依赖降到最低限度。 实际上HornetQ的核心部分只有一个外部依赖,就是netty.jar。HornetQ使用了其中的用于缓冲的一些类。 我们相信这样的理念应该受到用户的欢迎。

由于依赖性很小,HornetQ可以非常容易地嵌入到其它应用中,或者加入到一些依赖注入式的框架中, 如JBoss Microcontainer,Spring或Google Guice。

每个HornetQ服务器都有自己的超高性能的持久日志(journal)用于消息和其它信息的持久化。

采用这种独特的高效日志要比采用普通数据库作为持久层的系统拥有更高的性能。

通常情况下分布在不同物理机器上的客户端同时访问HornetQ服务器。目前HornetQ提供了两套API供客户端使用:

  1. 核心API。这是一组普通的Java接口,用它可以访问HornetQ的全部功能。

  2. JMS客户端API。这是标准的JMS API。

实际上JMS API是在核心API的外部加上一层简单的封装。

在HornetQ内核是没有JMS的,这样设计的目的是为了支持多个协议。

当客户端通过JMS接口访问HornetQ时,所有JMS的操作都被转换成相应的核心API,然后将请求以HornetQ格式发向服务器。

HornetQ服务器只接收核心API的访问。

图3.1描述了这些操作。

在图3.1中示出了两个用户访问HornetQ服务器。用户1使用JMS API,用户2使用的是核心API。

图中清楚的展示出了JMS是如何通过封装(facade)转化为核心API的。

5.2. 将HornetQ嵌入到你的应用程序中

如果你的应用程序内部需要消息服务,但同时你又不想将消息服务暴露为单独的HornetQ服务器,你可以在应用中直接将HornetQ实例化。

有关嵌入式HornetQ的详细信息请参阅 Chapter 43, 嵌入式HornetQ

5.3. 将HornetQ与JEE应用服务器集成

HornetQ提供了标准的JCA适配器,利用它可以将HornetQ轻松地集成到任何一个符合JEE规范的应用服务器或servlet容器中。

JEE应用服务品提供了消息Bean(MDB)用于处理来自外部的消息,比如来自JMS系统或邮件系统的消息。

最常见的应用应该是用MDB来接收来自JMS系统中的消息了。在JEE规范中规定了JEE应用服务器使用JCA adaptor与JMS消息系统集成, MDB通过这个adaptor来接收消息。

JCA adaptor不仅可以用来接收消息,还可以用来从EJB或servlet中向外部的JMS发送消息。在JEE应用服务器中应该用JCA adaptor与JMS系统进行交互。 实际上JEE规范中不允许在JEE服务器中不通过JCA而直接访问JMS系统。

在EJB中使用消息往往需要连接池或交易,而JCA可以提供这方面的服务,无需额外的开发任务。当然直接访问JMS系统是可能的, 但是你将不能利用JCA所提供的这些有用的功能,因此我们不建议使用直接访问的方式。

图3.2给出了HornetQ通过JCA adaptor与JEE应用服务器集成的示意图。图中可以看出所有的交互都通过JCA adaptor。

图中带有禁止符号的箭头表明的是从EJB会话Bean直接访问HornetQ的情况。由于不通过JCA,这种方法往往造成每次EJB访问HornetQ都要新建一个连接和会话, 使效率大降低。这被视为反设计模式(anti-pattern)。

Chapter 32, Java EE和应用服务器的集成对如何使用JCA给出了更加详细的描述。

5.4. HornetQ作为独立的服务(standalone)

HornetQ可以部署成为独立的服务器。它可运行于任何JEE应用服务器之外,作为一个独立的服务运行。 作为独立服务器运行时,HornetQ消息服务器包括一个核心服务器,一个JMS服务以及一个JNDI服务。

JMS服务用来部署服务器端hornetq-jms.xml配置文件中的JMS Queue,Topic和ConnectionFactory实例。 此外它还提供一组简单的管理接口,通过这些接口可以创建、消毁(destroy)Queue,Topic和ConnectionFactory实例。 用于可以通过JMX或连接使用这些接口。JMS服务是单独的服务,它不是HornetQ核心服务。HornetQ的核心不包含JMS相关的服务。 如果你不需要通过服务器端的xml配置文件部署任何JMS对象,也不需要JMS的管理接口,你可以选择不启动该服务。

启动JNDI服务的目的是因为JMS需要通过JNDI来获得Queue,Topic以及ConnectionFactory。如果不需要,也可以选择不启动该服务。

HornetQ允许在客户端程序中通过编程来直接创建各种JMS对象和核心对象来代替JNDI查找,所以JNDI不是必需的。 HornetQ采用JBoss Microcontainer来引导并实例化服务,并保证模块之间的依赖关系。JBoss Microcontainer是一个轻量级的POJO引导器(bootstrapper)。

图3.3给出了HornetQ独立服务器的架构。

相关配置的相关信息可以在第Section 47.1, “服务器配置”找到。$