Chapter 6. 使用HornetQ服务

本章将介绍如何使用HornetQ服务。

其中的内容包括服务器的位置,如何启动和停止HornetQ服务器。本章还将解释HornetQ的目录结构,其中的文件及其用途。

本章中所提到的HornetQ服务器是指HornetQ默认配置的独立服务器,包含JMS服务和JNDI服务。

对于运行于JBoss应用服务器中的HornetQ,其基本结构是一样的,只是有一些小的差别。

6.1. 服务的启动和停止

在HornetQ的安装目录下bin子目录中包含有一个unit/linux脚本run.sh和对应的Windows批处理文件run.bat。

如果你是在Unix/Linux环境,在bin目录下运行./run.sh

如果是在Windows环境,则在bin目录下运行 run.bat

这个脚本文件会设置classpath以及各种JVM参数,并启动JBoss Microcontainer。JBoss Microcontainer是一个轻量级的容器。 它被用来部署HornetQ的POJO对象。

要停止服务,运行其中的相应脚本:在Unix/Linux环境下,运行 stop.sh。 在Windows环境,运行 run.bat

注意HornetQ需要在Java 6及以上版本才能正常运行。

启动和停止脚本在默认条件下读取config/stand-alone/non-clustered目录下的配置文件。 如果要指向其他目录,可以在命令行实现,例如: ./run.sh ../config/stand-alone/clustered。 这一方法同样适用于Windows批处理文件。

6.2. 服务器端JVM参数的设置

在启动脚本run.shrun.bat中设置了一些JVM参数, 这些参数主要是调整Java 6的运行环境及拉圾回收的策略。我们建议采用并行拉圾回收的方法。 这种方法可以将拉圾回收所造成的延时进行平均分配,有效减少由于拉圾回收引起的长时间暂停的情况。

默认条件下HornetQ需要最大1GB的内存空间。通过-Xms-Xmx可以调整Java程序内存的使用。

你可以向启动脚本中添加其它的参数或修改已有的参数,已满足你的需要。

6.3. 服务器端的classpath

HornetQ在其classpath中寻找配置文件。

classpath被定义在run.shrun.bat脚本中。在HornetQ的发布中,启动脚本将非集群的配置文件目录加进了classpath中。该目录包括了一组配置文件,可以让HornetQ以基本的非集群方式运行。它的具体位置是在HornetQ发布根目录下 config/stand-along/non-clustered/ 子目录。

在HornetQ的发布包中包括了一组标准的配置目录,它们是:

  • 非集群方式的独立服务器配置

  • 集群方式的独立服务器配置

  • 非集群方式运行于JBoss应用服务器

  • 集群方式运行于JBoss应用服务器

当然你可以创建自己定义的配置文件目录。要注意的是将你的目录加到classpath中以便HornetQ能正确找到并加载。

6.4. Library Path

如果要在Linux上使用异步IO的日志(Asynchronous IO Journal), 你需要在java选项中指定java.library.pathrun.sh脚本可以自动完成这一步。

如果没有指定java.library.path,JVM将使用LD_LIBRARY_PATH环境变量。

6.5. 系统变量

HornetQ命令行可以接受系统变量来配置日志(logging)。有关logging配置的具体信息参见Chapter 42, 日志(Logging)

6.6. 配置文件

配置文件的路径定义在 run.shrun.bat 脚本中的classpath里。该路径下可以包含以下文件:

  • hornetq-beans.xml (如果是运行在JBoss应用服务器内,则为 hornetq-jboss-beans.xml)。这是JBoss Microcontainer的bean配置文件。其中定义了HornetQ的 各种bean,以及它们之间的依赖关系。HornetQ的bean都是一些POJO。是JBoss Microcontainer保证了这些bean的正确装载和运行。

  • hornetq-configuration.xml。这个是HornetQ的主要的配置文件。 其中的所有参数在Chapter 47, 配置参数索引中给出了解释. 在 Section 6.9, “主配置文件” 也有更多的相关信息。

  • hornetq-queues.xml。这个文件里包含了预定义的queue以及它们的配置,包括安全设置。 这是一个可选的文件,里面所有的内容都可以放在 hornetq-configuration.xml文件中。 在默认的配置文件目录下并没有这个文件。HornetQ之所以提供这个文件是为了用户便于管理他们的queue。在classpath中 允许包含多个 hornetq-queues.xml 文件。所有的这些文件都会被加载。

  • hornetq-users.xml。用户信息文件。HornetQ本身实现了一个基本的 安全管理器(security manager),它从这个文件内读取用户的安全信息,如用户名,密码和角色。 想了解更多关于安全的信息,参见 Chapter 31, 安全

  • hornetq-jms.xml。这个文件包含有JMS对象。HornetQ的默认配置中包含有JMS服务, 它从这个文件中读取JMS Queue,Topic和ConnectionFactory并将它们部署到JNDI服务中。如果你不使用JMS, 或者你不需要部署这些JMS对象,那么你就不需要这个文件。有关JMS的使用详见Chapter 7, 使用JMS

  • logging.properties 这个文件用于配置logging handlers。详见 Chapter 42, 日志(Logging)

  • log4j.xml。 这是 Log4j handler的配置文件。

Note

如果在hornetq-configuration.xml文件中将file-deployment-enabled 参数 定义为false,则HornetQ将不会加载其它的配置文件。这个参数的默认值是true。

所有配置文件中的参数都可以用系统变量来定义其值。以下用一个connector的配置来说明:

<connector name="netty">
         <factory-class>org.hornetq.integration.transports.netty.NettyConnectorFactory
           </factory-class>
         <param key="host"  value="${hornetq.remoting.netty.host:localhost}" type="String"/>
         <param key="port"  value="${hornetq.remoting.netty.port:5445}" type="Integer"/>
</connector>

在上面的配置中我们定义了两个系统变量 hornetq.remoting.netty.hosthornetq.remoting.netty.port。它们的值会被相应的系统变量的值(如果定义了的话)所替代。 如果没有定义这些系统变量,它们的默认值将分别为 localhost 及 5445。也可以不给出默认值,但如果这样就 必须要定义相应的系统变量。

6.7. JBoss Microcontainer Beans 文件

HornetQ的POJO对象是由 JBoss Microcontainer 进行加载和运行的。JBoss Microcontainer是一个轻量级的加载工具。

Note

如果是在JBoss应用服务器内运行,HornetQ同样需要一个bean的配置文件来将其部署到JBoss中。但是这与单独运行时的配置文件略有不同。 这是因为应用服务器内已经部署了一些服务,如安全服务等。所以在HornetQ中这些服务就不需要再部署了。

让我们看一个HornetQ作为单独服务器时的一个配置文件例子:

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="urn:jboss:bean-deployer:2.0">

<bean name="Naming" class="org.jnp.server.NamingBeanImpl"/>

<!-- JNDI server. Disable this if you don't want JNDI -->
<bean name="JNDIServer" class="org.jnp.server.Main">
   <property name="namingInfo">
      <inject bean="Naming"/>
   </property>
   <property name="port">1099</property>
   <property name="bindAddress">localhost</property>
   <property name="rmiPort">1098</property>
   <property name="rmiBindAddress">localhost</property>
</bean>

<!-- MBean server -->
<bean name="MBeanServer" class="javax.management.MBeanServer">
   <constructor factoryClass="java.lang.management.ManagementFactory"
      factoryMethod="getPlatformMBeanServer"/>
</bean> 

<!-- The core configuration -->
<bean name="Configuration" class="org.hornetq.core.config.impl.FileConfiguration">
</bean>

<!-- The security manager -->
<bean name="HornetQSecurityManager" 
      class="org.hornetq.spi.core.security.HornetQSecurityManagerImpl">
   <start ignored="true"/>
   <stop ignored="true"/>
</bean>

<!-- The core server -->
<bean name="HornetQServer" class="org.hornetq.core.server.impl.HornetQServerImpl">
   <start ignored="true"/>
   <stop ignored="true"/>  
   <constructor>
      <parameter>
         <inject bean="Configuration"/>
      </parameter>
      <parameter>
         <inject bean="MBeanServer"/>
      </parameter>
      <parameter>
         <inject bean="HornetQSecurityManager"/>
      </parameter>        
   </constructor>         
</bean>

<!-- The JMS server -->
<bean name="JMSServerManager" 
      class="org.hornetq.jms.server.impl.JMSServerManagerImpl">
   <constructor>         
      <parameter>
         <inject bean="HornetQServer"/>
      </parameter>         
   </constructor>
</bean>

</deployment>

我们从上可以看出HornetQ的单独服务器(以及核心服务器)包括了一些POJO对象:

  • JNDIServer

    很多客户端需要JNDI来获取JMS的对象,因此我们提供了一个JNDI服务来满足它们。如果不需要JNDI,可以在配置 文件中将它们注释掉。

  • MBeanServer

    这个对象提供了JMX管理接口。它是一个MBean服务器,可管理的对象可以注册到这个服务器上。 通常这就是一个JVM内部的默认的平台MBean服务器。如果不需要些服务,可以在配置文件中将其注释或删除。

  • Configuration

    这是HornetQ的Configuration对象。默认时它是一个FileConfiguration对象。它可以从文件系统中读取 配置信息。有些情况下(如嵌入式HornetQ)你可以将它定义为其它对象,以便用其它方法获得配置信息。

  • Security Manager. 可配置的安全管理器。默认的安全管理器使用 hornetq-users.xml 文件中的配置信息。 它也可以配置为一个JAAS的安全管理器。当HornetQ运行于JBoss应用服务器中时,它还可以配置为JBoss的安全管理器,以达到更紧密的集成。 如果不需要安全管理,你也可以将它删除。

  • HornetQServer

    这是HornetQ的核心服务对象,几乎所有的核心功能都在这里。

  • JMSServerManager

    这个对象将hornetq-jms.xml文件中定义的JMS的对象进行部署,比如JMS Queues, Topics 以及ConnectionFactory。它还提供一套简单的管理接口以方便地对这些JMS对象进行管理。通常它只是将工作代理给 核心服务器。如果你不需要在服务器端进行JMS对象的部署与管理,可以将它从配置中去掉。

6.8. JBoss AS4 MBean 服务

Note

本节只讨论在JBoss AS 4上配置HornetQ。其与JBoss Microcontainer的配置很相似。

<?xml version="1.0" encoding="UTF-8"?>
<server>

   <mbean code="org.hornetq.service.HornetQFileConfigurationService"
      name="org.hornetq:service=HornetQFileConfigurationService">
   </mbean>

   <mbean code="org.hornetq.service.JBossASSecurityManagerService"
      name="org.hornetq:service=JBossASSecurityManagerService">
   </mbean>

   <mbean code="org.hornetq.service.HornetQStarterService" 
      name="org.hornetq:service=HornetQStarterService">
      <!--lets let the JMS Server start us-->
         <attribute name="Start">false</attribute>

      <depends optional-attribute-name="SecurityManagerService"
         proxy-type="attribute">org.hornetq:service=JBossASSecurityManagerService</depends>
      <depends optional-attribute-name="ConfigurationService"
         proxy-type="attribute">org.hornetq:service=HornetQFileConfigurationService</depends>
   </mbean>

   <mbean code="org.hornetq.service.HornetQJMSStarterService"
      name="org.hornetq:service=HornetQJMSStarterService">
      <depends optional-attribute-name="HornetQServer"
         proxy-type="attribute">org.hornetq:service=HornetQStarterService</depends>
   </mbean>
   
</server>
            

这个jboss-service.xml包含在hornetq-service.sar文件中,它用来配置AS4中嵌入运行的HornetQ。 在这个配置文件中我们启动了以下几个服务:

  • HornetQFileConfigurationService

    这个MBean服务的任务是管理 FileConfiguration POJO的生命周期。

  • JBossASSecurityManagerService

    这个MBean服务管理着 JBossASSecurityManager POJO的生命周期。

  • HornetQStarterService

    这个MBean服务管理着HornetQServer POJO。它依赖于 JBossASSecurityManagerService 和 HornetQFileConfigurationService 这两个MBean。

  • HornetQJMSStarterService

    这个MBean服务管理着 JMSServerManagerImpl POJO对象。如果不需要JMS,可以去掉这个服务。

  • JMSServerManager

    用于启动JMSServerManager。

6.9. 主配置文件

HornetQ 核心服务的配置保存在 hornetq-configuration.xml文件中。          FileConfiguration bean 读取这个文件来对消息服务器进行配置。

HornetQ有很多的配置参数。采用默认的配置在绝大多数情况下可以很好的运行。事实上每一个参数都有默认的处理,因此一个只包含有一个空 的configuration的配置文件是一个有效的文件。对各个参数的解释贯穿于本手册。你还可参参照 这里来查找你想看的参数。