Chapter 30. 管理

HornetQ拥有套丰富的管理接口。用户使用这些接口可以修改服务器配置、创建新的资源(如队列和 话题)、检查这些资源(如队列中有多少消息)并进行管理(从队列中删除消息)。这样用户可以 管理HornetQ。另外,客户还可以订阅管理通知。

有三种方式管理HornetQ:

虽然有三种方式,但它们提供相同的功能。使用JMX方法能完成的功能使用核心接口或JMS接口都可以完成。

根据不同的应用环境来选择最适当的方式。

30.1. 管理接口API

不管使用哪种方式,管理接口都是一样的。

对于每个被管理的资源都有一个Java的接口提供可使用的操作。

HornetQ的管理接口分布在2个包中:

  • 核心资源的管理接口在 org.hornetq.api.core.management包中。

  • JMS资源的管理接口在 org.hornetq.api.jms.management包中。

调用管理操作的方法由所使用是方式是JMX、核心消息还是JMS 消息来决定。

Note

一小部分的管理接口需要一个过滤器参数来选择需要的消息。 如果要求所有的消息,传递该参数时使用 null或者一个空的字符串即可。

30.1.1. 核心管理接口

HornetQ定义了一套对核心资源的管理接口。关于它们的详细说明请参见相应的javadoc。 下面是对它们的概述:

30.1.1.1. 核心服务器管理

  • 队列的列表、创建、部署与删除

    getQueueNames() method方法用来列出所有已经部署的队列。

    HornetQServerControl (ObjectName org.hornetq:module=Core,type=Server或资源名core.server)上有队列创建或删除的方法,它们是 createQueue()deployQueue()destroyQueue()

    如果队列已经存在,那么createQueue方法调用会出错,而 deployQueue方法调用没有任何作用。

  • 暂停与恢复队列

    QueueControl可用来暂停与恢复队列。如果一个队列被暂停,它 虽然可以继续接收消息但是不传递消息;当被恢复时,队列又会开始传递消息。

  • 远程连接的列表与关闭

    listRemoteAddresses()方法可以用来列出客户端的远程地址。 还可以使用closeConnectionsForAddress()方法来关闭 与该地址相关的远程连接。

    另外,使用listConnectionIDs()方法可以列出连接ID, 使用listSessions()方法可以列出与一个连接ID相关的所有 会话(session)。

  • 事务的手动操作(heuristic operations)

    当服务器由于故障而重新启动时,可能造成一些事务没有完成而需要人工干预。 listPreparedTransactions()方法可以列出所有处于 准备(prepared)状态的事务(事务是用Base64字符串的形式列出)。如果要提交或回滚, 可以使用commitPreparedTransaction()方法或 rollbackPreparedTransaction()方法。采用启发式 (heuristic)完成的事务可以用listHeuristicCommittedTransactions() 方法和listHeuristicRolledBackTransactions方法列出。

  • 打开和重置消息计数器

    消息计数器可以用enableMessageCounters()方法打开,用 disableMessageCounters()方法关闭。如果要重置消息计数器, 可以使用resetAllMessageCounters()方法和 resetAllMessageCounterHistories()方法。

  • 获得服务器的配置和属性

    HornetQServerControl提供了访问HornetQ服务器所有属性 的方法(例如getVersion()方法可以得到服务器的版本,等等)。

30.1.1.2. 核心地址的管理

核心地址可以通过AddressControl类进行访问(ObjectName 是 org.hornetq:module=Core,type=Address,name="<the address name>"或者资源名 core.address.<the address name>)。

  • 修改地址的角色和权限。

    你可以使用addRole()方法或removeRole() 方法添加或删除地址的角色。用getRoles()方法可以列出一个地址的所有角色。

30.1.1.3. 核心队列的管理

管理接口中的一大部分是管理核心队列的。QueueControl类定义了核心队列的管理 接口(ObjectName org.hornetq:module=Core,type=Queue,address="<绑定地址 address>",name="<队列名>" 或资源名 core.queue.<队列名>)。

绝大部分的队列管理方法需要一个消息ID参数(如删除一个消息)或一个过滤器参数(如将具有某个 属性值的所有消息设置为过期)。

  • 消息的过期,发向死信地址及删除

    expireMessages()方法可以使消息过期。如果设置了一个过期地址, 这些消息会被发到过期地址。否则这些消息会被丢弃。setExpiryAddress() 方法可以用来设置队列的过期地址。

    消息可以用sendMessagesToDeadLetterAddress()方法发送到 一个死信地址。它返回发到这个死信地址的消息的数量。如果没有设置死信地址,那么消息就会从队列中 删除。用setDeadLetterAddress()方法可以设置队列的死信地址。

    消息还可以从一个队列转移到另一个队列。其方法是 moveMessages()

  • 消息的列表与删除

    listMessages()方法可以列出一个队列中的所有消息。这个方法 返回的是一个Map的数组。每一个Map对应一个消息。

    消息可以用removeMessages()方法删除。如果是使用消息ID, 返回的是一个布尔常量;如果是用过滤器,则返回的 是删除的消息数量。在使用过滤器来删除过滤的消息时,如果传入一个空字符串则表示要删除 所有的消息。

  • 消息计数

    一个队列中的消息数可以用getMessageCount()方法获得。 此外,countMessages()方法可以返回队列中与一 个过滤器匹配的消息数量。

  • 修改消息的优先级

    changeMessagesPriority()方法可以改变消息的优先级。 该方法如果带一个消息ID参数,返回一个布尔常量;如果带一个过滤器参数,返回优先级 被更新的消息的数量。

  • 消息计数器

    listMessageCounter()方法和 listMessageCounterHistory()方法可以列出一个队列的消息计数器。 (参见 Section 30.6, “消息计数器”)。消息计数器还可以 用resetMessageCounter()方法重置。

  • 获得队列的属性

    通过QueueControl可以获得核心队列的属性(例如用 getFilter()方法可以得到队列的 过滤器,isDurable()方法可以知道队列是否是持久的队列等等)。

  • 暂停和恢复队列

    QueueControl可用来暂停与恢复队列。如果一个队列被暂停,它 虽然可以继续接收消息但是不传递消息;当被恢复时,队列又会开始传递消息。

30.1.1.4. 其它核心资源的管理

HornetQ允许用户启动或停止其远程资源(接收器,转发器,桥,等等)。这样可以使服务器暂停工作 而不需要完全停止服务器(比如可以临时对服务器进行一些离线操作,像对一些事务的处理)。这些资源有:

  • 接收器

    AcceptorControl类(ObjectName org.hornetq:module=Core,type=Acceptor,name="<接收器名 >" 或资源名 core.acceptor.<地址名 >)的start()方法启动,用 stop()方法停止。接收器的参数可以通过AcceptorControl 的属性获得。(参见 Section 16.1, “接收器(Acceptor)”)。

  • 转发器

    DivertControl(ObjectName是 org.hornetq:module=Core,type=Divert,name=<转发器名> 或资源名core.divert.<转发器>)类的 start()方法可以启动,用stop()方法可以停止。 通过DivertControl还可以获得转发器的各种属性。(参见 Chapter 35, 消息的转发(divert)与分流)。

  • 桥可以通过BridgeControl类(ObjectName org.hornetq:module=Core,type=Bridge,name="<桥的名字 >" 或资源名 core.bridge.<桥的名字 >)的start() 方法启动,用stop()方法停止。它的属性可以通过 BridgeControl的属性获得(参见 Chapter 36, 核心桥)。

  • 广播组

    广播组可以通过BroadcastGroupControl类(ObjectName org.hornetq:module=Core,type=BroadcastGroup,name="<广播组名 >" 或者资源名 core.broadcastgroup.<广播组名>)的 start()方法启动,用stop()方法停止。 它的属性也可以通过BroadcastGroupControl的属性获得(参见Section 38.2.1, “广播组”)。

  • 发现组

    发现组可以通过DiscoveryGroupControl类 (ObjectName org.hornetq:module=Core,type=DiscoveryGroup, name="<发现组名>" 或资源名core.discovery.< 发现组名>)的 start()方法启动,用stop()方法停止。 它的参数可以通过DiscoveryGroupControl的属性获得(参见 Section 38.2.2, “发现组”)。

  • 集群连接

    集群连接可以通过ClusterConnectionControl类( ObjectName org.hornetq:module=Core,type=ClusterConnection,name="<集群连接名 >" 或资源名 core.clusterconnection.<集群连接名>)的 start()方法启动,用stop()方法停止。 它的参数可以通过ClusterConnectionControl的属性来获得(参见 Section 38.3.1, “配置集群连接”)。

30.1.2. JMS管理接口

HornetQ定义了一套JMS管理接口来管理JMS的可管理的对象 (例如JMS队列,话题及连接工厂)。

30.1.2.1. JMS服务器管理

JMSServerControl类(ObjectName org.hornetq:module=JMS,type=Server 或资源名jms.server)用来创建JMS资源(连接工厂和目标)。

  • 列表、创建、删除连接工厂

    使用getConnectionFactoryNames() 方法可以列出部署的连接工厂的 名字。

    createConnectionFactory()方法和destroyConnectionFactory()方法能创建和删除JMS连接工厂。 这些连接工厂都与JNDI绑定以便于客户端来查找。如果是在图形介面下创建连接工厂,在广本框内输入 有关的传输参数时可使用一组用逗号隔开的键-值对(例如key1=10, key2="value", key3=false)。 如果需要定义多个传输,你需要将每个传输的参数对用大括号括起来,例如{key=10}, {key=20}。 第一个key属于第一个传输配置,第二个key属于第二个传输配置。 (有关传输的各种参数参见Chapter 16, 传输层的配置)。

  • 列表、创建与删除队列

    getQueueNames()方法可以获得部署的JMS队列的名字列表。

    JMS队列可以用createQueue()方法创建,用destroyQueue()方法删除。 创建的队列都绑定到JNDI以便JMS客户端可以查找。

  • 列表、创建与删除话题(topic)

    getTopicNames()方法可以获得部署的JMS话题名字。

    JMS话题可以用createTopic()方法来创建,用destroyTopic()方法来删除。 创建的话题都绑定到JNDI以便客户端查找。

  • 远程连接的列表与关闭

    listRemoteAddresses()方法可以获得JMS客户端的远程地址。 还可以用closeConnectionsForAddress()方法关闭与某个远程地址相关联的连接。

    另外,listConnectionIDs()方法可以列出连接的ID, 而listSessions()方法可以列出一个给定的连接ID的所有会话(session)。

30.1.2.2. JMS连接工厂的管理

使用类(ObjectName org.hornetq:module=JMS,type=ConnectionFactory, name="<连接工厂名>"或者资源名jms.connectionfactory.< 连接工厂名>)可以管理JMS的连接工厂。

  • 获得连接工厂的属性

    ConnectionFactoryControl类可以用来获得连接工厂的属性( 例如getConsumerWindowSize()方法可以获得接收者流控制的窗口大小, isBlockOnNonDurableSend()方法可以知道从这个连接工厂创建的发送 者是否采用阻塞方式发送非持久的消息,等等)。

30.1.2.3. JMS队列管理

使用JMSQueueControl类(ObjectName org.hornetq:module=JMS, type=Queue,name="<队列名>"或资源名 jms.queue.<队列名 >可以管理JMS队列。

JMS队列的管理操作与核心队列的管理十分相似。

  • 过期,发送到死信地址和移动消息

    可以使用expireMessages()方法将队列中的消息设成过期消息。 如果配置有过期地址,消息就会被发到过期地址。过期地址可以用 setExpiryAddress()方法来设定。

    使用sendMessagesToDeadLetterAddress()方法可以将消息发送到死信地址。 它返回发送到死信地址消息的数量。如果没有设定死信地址,那么消息会被丢弃。使用 setDeadLetterAddress()方法可以设定队列的死信地址。

    moveMessages()方法将消息从一个队列移动到另一个队列。

  • 列表与删除消息

    使用listMessages()方法可以列出一个队列中的所有消息。它返回的是一个 Map的数组。每一个Map对应一个消息。

    使用removeMessages()方法可以从队列中删除消息。如果带的参数是消息ID, 返回的是一个布尔常是;如果带的参数是一个过滤器,则返回删除的消息数。带有过滤器参数的removeMessages()方法只删除过滤器选择的消息。如果些参数是一个空字符串,那么将 删除所有的消息。

  • 消息计数

    使用getMessageCount()方法可以得到队列中的消息数。另外,方法 countMessages()可以得到队列中所有与过滤器相匹配的消息数。

  • 修改消息的优先级

    消息的优先级可以用changeMessagesPriority()方法修改。如果是带一个消 息ID参数,它返回的是一个布尔常量;如果是带一个过滤器参数,则它返回的是优先级更新了的消息数。

  • 消息计数器

    listMessageCounter()方法和listMessageCounterHistory() 方法可以用来列出队列中的所有消息计数器。(参见 Section 30.6, “消息计数器”)。

  • 获取队列的属性

    JMSQueueControl类可以用来获取JMS队列的设置参数(例如方法isTemporary() 可以判断队列是否为临时的,方法isDurable()可以判断队列是否为持久的等等)。

  • 队列的暂停与恢复

    JMSQueueControl可以暂停一个队列或恢复一个队列。 如果一个队列被暂停,它虽然可以继续接收消息但是不传递消息; 当被恢复时,队列又会开始传递消息。

30.1.2.4. JMS话题(Topic)的管理

JMS话题的管理是通过TopicControl类( the ObjectName org.hornetq:module=JMS,type=Topic,name="<话题名>" 或资源名 jms.topic.<话题名>)。

  • 订阅和消息的列表

    listAllSubscriptions()listDurableSubscriptions()listNonDurableSubscriptions()方法可以列出话题的不同订阅。 这些方法都返回Object数组,表示订阅的细节(如订阅名, 客户ID,持久性,消息计数等)。用listMessagesForSubscription()方法可以列出一个订阅上的JMS消息。

  • 删除订阅

    持久性订阅可以使用dropDurableSubscription()方法来删除。

  • 订阅消息计数

    countMessagesForSubscription()方法可以得到一个订阅上面所持有 的消息数(还可带一个消息选择器来得出有多少消息与之匹配)。

30.2. 使用JMX

HornetQ提供了JMX

HornetQ通过MBean的接口暴露其JMX管理操作。它将自己的资源注册到org.hornetq域。

比如,用来管理一个名为exampleQueueJMS队列的ObjectName是:

   org.hornetq:module=JMS,type=Queue,name="exampleQueue"   
      

MBean为:

   org.hornetq.api.jms.management.JMSQueueControl   
      

MBean的ObjectNameorg.hornetq.api.core.management.ObjectNameBuilder来产生出来的。你也可以使用jconsole来查找你想要的MBean的ObjectName

使用JMX来管理HornetQ与用JMX管理其它Java应用程序没有什么不同。你可以使用反射或者创建MBean代理的方法。

30.2.1. 配置JMX

默认情况下HornetQ的JMX是打开的。将hornetq-configuration.xml文件中的jmx-management-enabled设置为false就可以关闭JMX:

<!-- false to disable JMX management for HornetQ -->
<jmx-management-enabled>false</jmx-management-enabled>            
         

如果JMX功能是打开的,则使用jconsole可以管理本地的HornetQ。

Note

出于安全考虑,默认情况下JMX远程连接是关闭的。参见Java管理指南来配置服务器的远程管理(系统变量必须在run.shrun.bat中定义)。

HornetQ默认使用JMX域名"org.hornetq"。如果要用一个MBeanServer管理多个HornetQ服务器,可以将每个HornetQ 服务器配置成不同的JMX域。方法就是在hornetq-configuration.xml文件中设置jmx-domain

<!-- use a specific JMX domain for HornetQ MBeans -->
<jmx-domain>my.org.hornetq</jmx-domain>            
         

30.2.1.1. MBeanServer的配置

HornetQ在独立运行时使用Java虚拟机的Platform MBeanServer来注册其MBean。这在JBoss Microcontainer(微容器)的bean 文件中进行配置(参见Section 6.7, “JBoss Microcontainer Beans 文件”):

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

当与AS 5+集成运行时,它使用应用服务器自己的MBean服务,这样就可以使用它的jmx-console:

<!-- MBeanServer -->
<bean name="MBeanServer" class="javax.management.MBeanServer">
   <constructor factoryClass="org.jboss.mx.util.MBeanServerLocator"
                         factoryMethod="locateJBoss" />
</bean>            
            

30.2.2. 例子

参见Section 11.1.21, “JMX管理”,这个例子展示了如何使用远程JMX连接或MBean代理来管理HornetQ。

30.3. 使用核心接口

核心管理接口的调用实际上是向一个特殊的地址发送核心消息。这个特殊地址称为管理地址

管理消息是一些定义了一些固定属性的普通核心消息。服务器通过这些属性来解释管理操作:

  • 管理资源的名称

  • 管理操作的名称

  • 管理操作的参数

当一个管理消息发送到管理地址时,HornetQ服务器将从中提取出相应的信息,再调用相应的管理资源的方法,之后向 该管理消息的回答地址(reply-to address,由ClientMessageImpl.REPLYTO_HEADER_NAME 定义)发送一个管理回答

一个ClientConsumer用来接收管理回答并提取出其中的操作的結果(如果有的话)。 考虑到可移植性,返回的結果采用的是格式的字符串,而没有采用Java的序列化技术 (org.hornetq.api.core.management.ManagementHelper可以用来将JSON字符串 转换成Java对象)。

使用以下步骤可以简化使用核心消息调用管理操作:

  1. 创建一个ClientRequestor对象,用来发送管理消息并接收回答。

  2. 创建一个ClientMessage

  3. 使用org.hornetq.api.core.management.ManagementHelper类来帮助设置消息的管理参数。

  4. 通过ClientRequestor将消息发送

  5. 使用 org.hornetq.api.core.management.ManagementHelper类从管理操作結果中提取返回值。

例如,要得到核心队列exampleQueue中消息的数量:

   ClientSession session = ...
   ClientRequestor requestor = new ClientRequestor(session, "jms.queue.hornetq.management");
   ClientMessage message = session.createMessage(false);
   ManagementHelper.putAttribute(message, "core.queue.exampleQueue", "messageCount");
   ClientMessage reply = requestor.request(m);
   int count = (Integer) ManagementHelper.getResult(reply);
   System.out.println("There are " + count + " messages in exampleQueue");
      

管理操作名及其参数必须和management包中定义的Java接口一致。

资源的名称是用org.hornetq.api.core.management.ResourceNames类来生成的, 命名都非常直观(如核心队列exampleQueue的名称为core.queue.exampleQueue, JMS Topic exampleTopic的名称为jms.topic.exampleTopic,等等)。

30.3.1. 配置核心管理

管理地址的配置在文件hornetq-configuration.xml中:

   <management-address>jms.queue.hornetq.management</management-address>
         

它的默认地址是jms.queue.hornetq.management (地址前缀加上 “jms.queue”是为了方便JMS客户端也可以向它发送管理消息。

管理地址需要一个特殊的用户权限 manage来接收并处理管理消息。这个权限也在hornetq-configuration.xml文件中配置:

   <!-- users with the admin role will be allowed to manage --> 
   <!-- HornetQ using management messages        -->
   <security-setting match="jms.queue.hornetq.management">
      <permission type="manage" roles="admin" />
   </security-setting>
         

30.4. 使用JMS进行管理

使用JMS管理HornetQ与使用核心API管理HornetQ十分相似。

其中一个重要的不同是JMS需要一个JMS队列来发送消息(而核心接口使用的是一个地址)。

管理队列是一个特殊的队列,它需要客户端直接实例化:

   Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management");
      

其余步骤完全和使用核心接口一样,只是相应的对象不同:

  1. 创建一个QueueRequestor来向管理地址发送管理消息并接收回答。

  2. 创建一个消息

  3. 使用 org.hornetq.api.jms.management.JMSManagementHelper类向消息中设置管理参数。

  4. 再使用QueueRequestor发送消息。

  5. 使用org.hornetq.api.jms.management.JMSManagementHelper来从回答中提取返回結果。

例如,要得到一个JMS队列exampleQueue中有多少消息:

   Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management");   
   
   QueueSession session = ...      
   QueueRequestor requestor = new QueueRequestor(session, managementQueue);
   connection.start();
   Message message = session.createMessage();
   JMSManagementHelper.putAttribute(message, "jms.queue.exampleQueue", "messageCount");
   Message reply = requestor.request(message);
   int count = (Integer)JMSManagementHelper.getResult(reply);
   System.out.println("There are " + count + " messages in exampleQueue");
      

30.4.1. 配置JMS管理

JMS管理的配置与核心接口管理的配置步骤是一样的(参见Section 30.3.1, “配置核心管理”)。

30.4.2. 例子

参见Section 11.1.25, “管理”,它展示了如何使用JMS消息来管理HornetQ。

30.5. 管理通知

HornetQ可以向listener发送各种事件的通知(如资源的创建,安全破坏等)。

有三种方式接收管理通知

  • JMX通知

  • 核心消息

  • JMS消息

30.5.1. JMX通知

如果设置了JMX(参见Section 30.2.1, “配置JMX”),就可以通过订阅以下 两个MBean来获得通知:

  • org.hornetq:module=Core,type=Server 可以获得有关 核心资源的通知

  • org.hornetq:module=JMS,type=Server可以获得有关 JMS资源的通知

30.5.2. 核心消息通知

HornetQ定义了一个特殊的管理通知地址。核心队列绑定到该地址后,客户 端就可以接收以核心消息形式发送的管理信通知了。

一个核心客户端要想接收到管理通知,它必须要创建一个队列并绑定到这个管理通知地址上,然后从这个 队列接收通知。

通知消息就是普通的核心消息加上相关的属性(如通知类型,事件发生时间,资源等)。

由于是标准的核心消息,使用选择器还能够过滤掉一部分通知而只接收感兴趣的通知。

30.5.2.1. 配置核心管理通知地址

用来发送管理通知的地址在文件中hornetq-configuration.xml配置:

               <management-notification-address>hornetq.notifications</management-notification-address>
            

默认的地址是hornetq.notifications

30.5.3. JMS消息通知

HornetQ还可以通过JMS消息的方式发送通知。

这种方式与核心消息通知相似,但是有一个重要的不同:JMS消息需要一个JMS的目标(通常是一个Topic)。

要通过一个JMS目标来接收管理通知,必须将服务器的管理通知地址修改为以jms.queue开头(如果是一个 JMS队列)或者jms.topic(如果是一个话题):

            <!-- 通知将从JMS话题 "notificationsTopic"上接收 --> 
            <management-notification-address>jms.topic.notificationsTopic</management-notification-address>
         

这个通知话题一旦被创建,就可以接收消息了(或者使用MessageListener):

   Topic notificationsTopic = HornetQJMSClient.createTopic("notificationsTopic");

   Session session = ...
   MessageConsumer notificationConsumer = session.createConsumer(notificationsTopic);
      notificationConsumer.setMessageListener(new MessageListener()
      {
         public void onMessage(Message notif)
         {
            System.out.println("------------------------");
            System.out.println("Received notification:");
            try
            {
               Enumeration propertyNames = notif.getPropertyNames();
               while (propertyNames.hasMoreElements())
               {
                  String propertyName = (String)propertyNames.nextElement();
                  System.out.format("  %s: %s\n", propertyName, notif.getObjectProperty(propertyName));
               }
            }
            catch (JMSException e)
            {
            }
            System.out.println("------------------------");
         }            
      });            
         

30.5.4. 例子

参见Section 11.1.26, “管理通知”。本例采用了JMS的 MessageListener方法从HornetQ 服务器接收管理通知。

30.6. 消息计数器

HornetQ保存着队列的历史数据,而消息计数器可以从服务器上获取这些信息。

这些信息可以显示队列的一些趋势。例如,使用管理接口你可以定期来查询一个队列 的消息数量。但这个数量不足以说明这个队列是否在工作--也许这个队列既没有发送者也没有接收者;也许这个队列 在不停地发送与接收,但是发送消息的速度与接收的速度相等。两咱情况下都会造成消息数在队列中不变,但实际队列 的状态确完全不一样。

消息计数器可以提供队列的更多的信息:

  • count

    从服务器启动时加到队列中的消息数。

  • countDelta

    上次消息计数器更新后加入到队列的消息数。

  • depth

    队列当前的消息数。

  • depthDelta

    上次消息计数器更新后被加入/删除的消息总数。 例如,如果depthDelta-10,就意谓着有10个消息从 队列中删除了(有可能是2个消息加入了但有12个消息删除了)。

  • lastAddTimestamp

    最后一个消息加入到队列的时间戳。

  • udpateTimestamp

    最后一次消息计数器更新的时间戳。

30.6.1. 配置消息计数器

默认的消息计数器是关闭的,因为它需要占用一些内存。

要打开消息计数器,编辑hornetq-configuration.xml文件将其设为true

<message-counter-enabled>true</message-counter-enabled>
         

消息计数器会保存队列的历史数据(默认是10天)。它以一定间隔(默认10秒一次)对每个队列进行扫描。 如果消息计数器打开,这些参数可以在hornetq-configuration.xml文件中进行调整:

<!-- keep history for a week -->
<message-counter-max-day-history>7</message-counter-max-day-history>            
<!-- sample the queues every minute (60000ms) -->
<message-counter-sample-period>60000</message-counter-sample-period>
         

使用管理接口可以获得消息计数器。例如要使用JMX得到一个JMS队列的消息计数器:

// retrieve a connection to HornetQ's MBeanServer
MBeanServerConnection mbsc = ...
JMSQueueControlMBean queueControl = (JMSQueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc,
   on,
   JMSQueueControl.class,
   false);
// message counters are retrieved as a JSON String                                                                                                      
String counters = queueControl.listMessageCounter();
// use the MessageCounterInfo helper class to manipulate message counters more easily
MessageCounterInfo messageCounter = MessageCounterInfo.fromJSON(counters);         
System.out.format("%s message(s) in the queue (since last sample: %s)\n",
   counter.getDepth(),
   counter.getDepthDelta());
         

30.6.2. 例子

参见Section 11.1.27, “消息计数器”。这个例子使用消息计数器来获得一个JMS队列的相关数据。

30.7. 通过JBoss应用服务器的Admin Console来管理HornetQ的资源

通过JBoss应用服务器的Admin Console可以创建与配置HornetQ的各种资源。

Admin Console允许你创建各种目标(JMS话题与队列)和JMS的连接工厂。

登录admin console后你在左边的树中会看到JMS Manager节点。所有HornetQ的资源都属于这个节点。在它的下面有JMS Queues、 Topics以及Connection Factories。分别点击它们将会看到相应的资源。下面将解释如何创建并配置它们。

30.7.1. JMS队列

要创建一个新的JMS队列,点击JMS Queues将列出当前的队列。在右边的窗口中有一个“add a new resource“按钮,点击这个按钮 并选择默认(JMS 队列)模板。点击“continue“。填入相应的队列名称与JNDI名称。其它的参数值都给出了合理的默认值,通常情况下 不用改动它们。在底部可以配置安全角色,如果你不提供将使用默认的配置。当这个队列成功创建后这些配置将会显示出来。除了队列的名字 和JNDI名字外,其它参数都可以在contiguration标签页下进行修改。下面就对它们分别解释。

点击 configuration后你将看到如下显示:

name和JNDI name是不能改变的。如果你想改变它们,必须重新创建队列。其它选项是关于地址设置与安全设置。 默认的地址设置来自于服务器的配置。如果你通过console修改或创建一个队列,那么就会增加一条新的地址设置。有关 地址设置的完整说明参见Section 25.3, “通过地址设置来配置队列属性”

要删除一个队列,只要点击队列名称旁边的“delete“按钮即可。与此队列相关的任何地址设置或安全设置也将被删除。

配置的最后一部分是安全角色。如果在创建时没有给出则默认的安全设置将会显示在屏幕上。如果它们被修改并更新则队列的安全设置 将被更新。关于安全设置参见Chapter 31, 安全

在console中还有一个metrics标签页,它显示了队列的各项统计数据,如消息计数,接收者计数等。

在control标签页中可以对队列进行各种操作,比如启动和停止队列,对队列中的消息进行列表,移动,变为过期,删除等。 要进行一项操作只要点击相应的按钮,然后在出现的提示中输入相应的参数,再点击ok按钮即可。操作的結果会显示在屏幕的底部。

30.7.2. JMS话题

创建及配置JMS话题几乎与队列的操作是一样的。唯一不同的是这些配置应用于一个代表订阅的队列。

30.7.3. JMS连接工厂

JMS连接工厂的创建的操作过程与上述队列或话题的操作一致,只是配置具体的参数不同而已。关于连接工厂的参数参见配置索引。