Sun Java System Message Queue 3.7 UR1 管理指南

第 6 章 管理物理目的地

本章介绍如何使用 imqcmd 实用程序管理物理目的地。Message QueueTM 消息通过代理上的物理目的地路由到使用方客户端。代理管理与物理目的地关联的内存和持久性存储库并设置它们的行为。

在代理群集中,您在某个代理上创建一个物理目的地后,群集会将该物理目的地传播给所有其他代理。应用程序客户端可以订阅某一主题,或者使用群集中任何代理上的队列,因为这些代理会协同工作,在整个群集中路由消息。但是,该消息的持久性和确认只由最初生成消息的代理负责管理。

本章包含以下主题:

表 13–5 中提供了用于管理物理目的地和完成上述任务的 imqcmd 子命令的完整参考信息。

有关物理目的地的介绍,请参见 Message Queue 技术概述


注 –

每当与物理目的地交互时,客户端应用程序都会使用目的地对象。为了实现提供者无关性和可移植性,客户端通常使用管理员创建的目的地对象,这些对象称为目的地受管理对象。可以配置受管理对象,使其可供客户端应用程序使用,如第 8 章,管理受管理对象中所述。


使用命令实用程序

可以使用 Message Queue 命令实用程序 (imqcmd) 来管理物理目的地。 imqcmd 命令的语法与管理其他代理服务时的语法一样。

有关 imqcmd 及其子命令和选项的完整参考信息,请参见第 13 章,命令行参考

子命令

表 6–1 列出了 imqcmd 子命令,本章介绍了这些子命令的用法。 有关这些子命令的参考信息,请参见物理目的地管理

表 6–1 命令实用程序的物理目的地子命令

子命令和参数 

描述 

compact dst

压缩一个或多个物理目的地的基于文件的数据存储库。 

create dst

创建物理目的地。 

destroy dst

销毁物理目的地。 

list dst

列出代理中的物理目的地。 

metrics dst

显示物理目的地度量。 

pause dst

暂停代理中的一个或多个物理目的地。 

purge dst

清除物理目的地中的所有消息,但不销毁该物理目的地。 

query dst

查询并显示有关物理目的地的信息。 

resume dst

恢复代理中的一个或多个暂停的物理目的地。 

update dst

更新目的地属性。 

创建物理目的地

要创建物理目的地,请使用 imqcmd create 子命令。 下面是 create 子命令的语法:

create dst -t destType -n 
destName [-o property=value
] [-o property=value1]

例如,要创建队列目的地,请输入以下命令:


imqcmd create dst -n myQueue -t q -o "maxNumActiveConsumers=5"

要创建主题目的地,请输入以下命令:


imqcmd create dst -n myTopic -t t -o "maxBytesPerMsg=5000"

创建物理目的地时,请指定以下内容:

也可以在更新物理目的地时设置属性。

许多物理目的地属性都影响代理的内存资源和消息流。例如,可以指定能发送到物理目的地的生成方数量,它们可以发送的消息数量和大小,以及达到物理目的地限制时代理应做出的响应。这些限制与由代理配置属性控制的代理范围的限制类似。

以下属性既适用于队列目的地,也适用于主题目的地:

以下属性只适用于队列目的地:

有关物理目的地属性的完整参考信息,请参见第 15 章,物理目的地属性参考

对于自动创建的目的地,在代理的实例配置文件中设置默认属性值。有关自动创建的属性的参考信息,请参见表 14–3

列出物理目的地

可以获得有关物理目的地的当前属性值、与物理目的地关联的生成方和使用方的数量以及消息传送度量(例如,物理目的地中消息的数量和大小)的信息。

要找到您希望获取其信息的物理目的地,请使用 list dst 子命令列出代理中的所有物理目的地。 下面是 list dst 子命令的语法:

list dst [-t destType] [-tmp]

该命令列出指定类型的物理目的地。目的地类型 (-t) 选项的值可以是 q(queue,队列)或 t(topic,主题)。

如果省略目的地类型,将列出所有类型的物理目的地。

list dst 子命令可以选择指定要列出的目的地的类型或包含临时目的地(使用 -tmp 选项)。临时目的地由客户端创建,通常用于接收发送到其他客户端的消息的回复。

例如,要获得在 myHost 端口 4545 上运行的代理中的所有物理目的地列表,请输入以下命令:

imqcmd list dst -b myHost:4545

除非指定目的地类型 t(表示只包括主题),否则,除其他所有物理目的地外,还始终会显示停用消息队列 mq.sys.dmq 的信息。

显示有关物理目的地的信息

要获得有关物理目的地当前属性的信息,请使用 query dst 子命令。下面是 query dst 子命令的语法:

query dst -t destType -n 
destName

此命令列出有关指定类型和名称的目的地的信息。例如,以下命令显示有关队列目的地XQueue 的信息:

imqcmd query dst -t q -n XQueue -u admin

此命令将产生类似如下内容的输出:


------------------------------------
Destination Name    Destination Type
------------------------------------
XQueue              Queue

On the broker specified by:

-------------------------
Host         Primary Port
-------------------------
localhost    7676

Destination Name                      XQueue
Destination Type                      Queue
Destination State                     RUNNING
Created Administratively              true

Current Number of Messages            0
Current Total Message Bytes           0
Current Number of Producers           0
Current Number of Active Consumers    0
Current Number of Backup Consumers    0

Max Number of Messages                unlimited (-1)
Max Total Message Bytes               unlimited (-1)
Max Bytes per Message                 unlimited (-1)
Max Number of Producers               100
Max Number of Active Consumers        1
Max Number of Backup Consumers        0

Limit Behavior                        REJECT_NEWEST
Consumer Flow Limit                   1000
Is Local Destination                  false
Local Delivery is Preferred           false
Use Dead Message Queue                true

输出还显示与目的地关联的生成方和使用方的数量。对于队列目的地,该数量包括活动使用方和备份使用方。

可以使用 update dst 子命令更改一个或多个属性的值(请参见更新物理目的地属性)。

更新物理目的地属性

可以使用 update dst 子命令更改物理目的地的属性,并使用 -o 选项指定要更新的属性。 下面是 update dst 子命令的语法:

update dst -t destType -n 
destName -o property=value [[-o 
property=value1]…]

此命令更新指定目的地上指定属性的值。属性名可以是表 15–1 中列出的任何属性。

可以使用 -o 选项多次更新多个属性。 例如,以下命令将 maxBytesPerMsg 属性更改为 1000,同时将 MaxNumMsgs 属性更改为 2000

imqcmd update dst -t q -n myQueue -o “maxBytesPerMsg=1000”
              -o “maxNumMsgs=2000” -u admin

有关可以更新的属性列表,请参见第 15 章,物理目的地属性参考

不能使用 update dst 子命令更新物理目的地的类型或更新 isLocalOnly 属性。


注 –

停用消息队列是专用的物理目的地,其属性与其他目的地的属性稍有不同。有关详细信息,请参见使用停用消息队列


暂停和恢复物理目的地

可暂停物理目的地以控制从生成方到目的地的消息传送,或从目的地到使用方的消息传送,或者同时控制二者。特别是,可暂停到目的地的消息流,以防止当消息的生成速度明显快于使用速度时,目的地由于所包含的消息过多而过载。 压缩物理目的地之前,必须先暂停它。

要暂停流入或流出物理目的地的消息传送,请使用 pause dst 子命令。下面是 pause dst 子命令的语法:

pause dst [-t destType -n 
destName] [-pst pauseType]

对于指定类型和名称的目的地,此子命令暂停将消息传送给使用方 (-pst CONSUMERS ),或暂停从生成方传送消息 (-pst PRODUCERS),或同时暂停二者 ( -pst ALL)。如果未指定目的地类型和名称,则暂停所有物理目的地。默认值为 ALL

示例:

imqcmd pause dst -n myQueue -t q -pst PRODUCERS -u admin
imqcmd pause dst -n myTopic -t t -pst CONSUMERS -u admin

要恢复向暂停目的地的传送,请使用 resume dst 子命令。下面是 resume dst 子命令的语法:

resume dst [-t destType -n 
destName]

此子命令恢复向指定类型和名称的暂停目的地传送消息。如果未指定目的地类型和名称,则恢复所有目的地。

示例:

imqcmd resume dst -n myQueue -t q

在代理群集中,物理目的地实例位于群集的各个代理中。 必须逐一暂停各个目的地。

清除物理目的地

可以清除物理目的地上当前排队的所有消息。清除物理目的地意味着目的地上存储的所有消息都将被删除。

当堆积的消息占用了过多的系统资源时,可能需要清除消息。当某个队列没有注册的使用方客户端,但仍然接收大量消息时,可能会发生这种情况。如果某个主题的长期订户始终处于非活动状态也可能发生这种情况。在上述两种情况下,都没有必要保留消息。

要清除物理目的地中的消息,请使用 purge dst 子命令。下面是 purge dst 子命令的语法:

purge dst -t destType -n 
destName

此子命令清除指定类型和名称的物理目的地中的消息。

示例:

imqcmd purge dst -n myQueue -t q -u admin
imqcmd purge dst -n myTopic -t t -u admin

如果关闭代理后不希望在重新启动代理时传送过时消息,请使用 -reset messages 选项清除过时消息;例如:

imqbrokerd -reset messages -u admin

这样可以避免重新启动代理后清除目的地的麻烦。

在代理群集中,物理目的地实例位于群集的各个代理中。必须分别清理每个目的地。

销毁物理目的地

要销毁物理目的地,请使用 destroy dst 子命令。下面是 destroy dst 子命令的语法:

destroy dst -t destType -n 
destName

该子命令销毁指定类型和名称的物理目的地。

示例:

imqcmd destroy dst -t q -n myQueue -u admin

销毁物理目的地将清除该目的地中的所有消息并将该目的地从代理中删除,此操作是不可逆的。

不能销毁停用消息队列。

压缩物理目的地

如果使用基于文件的数据存储库作为消息的持久性存储库,则可以监视磁盘使用情况并在必要时压缩磁盘。

可构建基于文件的消息存储库,以便将消息存储在与保存它的物理目的地对应的目录中。在每个物理目的地的目录中,大多数消息都存储在一个由大小可变的记录组成的文件中。 (为减少文件碎片,大小超过可配置阈值的消息将存储在单独的文件中。)

由于各种大小的消息先持久化,然后从记录文件中删除,因此可能会在文件中形成漏洞,从而使得文件中的空闲记录无法再次使用。

为管理未使用的空闲记录,命令实用程序包含用于监视每个物理目的地的磁盘利用率的子命令,以及在磁盘利用率降低时用于回收空闲磁盘空间的子命令。

监视物理目的地的磁盘利用率

要监视物理目的地的磁盘利用率,请使用如下所示的命令:

imqcmd metrics dst -t q -n myQueue -m dsk -u admin

此命令将产生类似如下内容的输出:


--------------------------------------
Reserved   Used      Utilization Ratio
--------------------------------------
806400     804096    99
1793024    1793024   100
2544640    2518272   98

子命令输出中的各列具有以下含义:

表 6–2 物理目的地磁盘占用度量

度量 

描述 

保留的

所有记录使用的磁盘空间(以字节为单位),其中包括保存活动消息的记录以及等待再次使用的空闲记录。 

已用的

保存活动消息的记录使用的磁盘空间(以字节为单位)。 

利用率

已用的磁盘空间除以保留的磁盘空间所得的商。 比率越高,可用于保存活动消息的磁盘空间就越多。

回收未使用的物理目的地磁盘空间

磁盘利用模式取决于使用特定物理目的地的消息发送应用程序的特征。根据流入和流出物理目的地的消息的相对数量,以及消息的相对大小,保留的磁盘空间可能会随时间而增加。

如果消息生产率大于消息使用率,则通常应该重新使用空闲记录,且应提高利用率。但是,如果消息生产率等于或小于消息使用率,则应降低利用率。

通常,应尽量使保留的磁盘空间保持一个稳定的量,并使磁盘利用率保持较高水平。一般规则是:如果系统达到稳定状态(其中保留的磁盘空间量较为稳定),且磁盘利用率较高(大于 75%),则不必回收未使用的磁盘空间。 如果系统达到稳定状态,而利用率较低(低于 50%),则可压缩磁盘以回收空闲记录占用的磁盘空间。

可以使用 compact dst 子命令压缩数据存储库。 下面是 compact dst 子命令的语法:

compact dst [-t destType -n 
destName]

此子命令为指定类型和名称的物理目的地压缩基于文件的数据存储库。如果未指定目的地类型和名称,则会压缩所有目的地。 压缩之前必须先暂停物理目的地。

如果保留的磁盘空间随时间持续增加,请通过设置目的地内存限制属性和限制行为来重新配置目的地的内存管理(请参见表 15–1)。

Procedure回收未使用的物理目的地磁盘空间

  1. 暂停目的地。


    imqcmd pause dst -t q -n myQueue -u admin
  2. 压缩磁盘。


    imqcmd compact dst -t q -n myQueue -u admin
  3. 恢复物理目的地。


    imqcmd resume dst -t q -n myQueue -u admin

    如果未指定目的地类型和名称,则会为所有物理目的地执行此操作。

使用停用消息队列

停用消息队列 mq.sys.dmq 是系统创建的物理目的地,它保存代理的停用消息及其他物理目的地。 停用消息队列是一个工具,用于监视、调整系统效率以及故障排除。有关术语“停用消息”的定义以及停用消息队列的更详细介绍,请参见 Message Queue 技术概述

代理在启动时会自动创建停用消息队列。如果代理无法处理消息或者消息的有效期到期,则代理会将消息放入该队列中。另外,其他物理目的地也可以使用停用消息队列来保存丢弃的消息。通过使用停用消息队列,可以提供有利于排除系统故障的信息。

配置停用消息队列的使用

默认情况下,物理目的地配置为使用停用消息队列。可以通过设置物理目的地属性 useDMQ 来禁止或允许物理目的地使用停用消息队列。

下面的示例创建一个名为 myDist 的队列,该队列在默认情况下使用停用消息队列:

imqcmd create dst -n myDist -t q

下面的示例禁止上述队列使用停用消息队列:

imqcmd update dst -n myDist -t q -o useDMQ=false

通过设置 imq.autocreate.destination.useDMQ 代理属性,可以允许或禁止代理中所有自动创建的物理目的地使用停用消息队列。

管理停用消息队列

可以使用 Message Queue 命令实用程序 (imqcmd) 像管理其他队列那样来管理停用消息队列,但有一些不同之处。 例如,由于停用消息队列是系统创建的,因此您不能创建、暂停或销毁它。另外,如表 6–3 中所示,停用消息队列的默认值有时与普通队列的默认值不同。

停用消息队列属性

配置停用消息队列与配置其他队列相似,但某些物理目的地属性不应用默认值或具有不同的默认值。表 6–3 列出了停用消息队列以独特方式处理的队列属性。

表 6–3 标准物理目的地属性的停用消息队列处理

属性 

停用消息队列的独特处理 

limitBehavior

停用消息队列的默认值为 REMOVE_OLDEST。(其他队列的默认值为 REJECT_NEWEST)停用消息队列不支持流控制。

localDeliveryPreferred

不适用于停用消息队列。 

maxNumMsgs

停用消息队列的默认值为 1000。对于其他队列,默认值为 -1(无限制)。

maxNumProducers

不适用于停用消息队列。 

maxTotalMsgBytes

对于停用消息队列,默认值为 10 MB。对于其他队列,默认值为 -1(无限制)。

isLocalOnly

在代理群集中,停用消息队列始终是全局物理目的地,此属性永久性地设置为 false

消息内容

代理可以将完整的消息放入停用消息队列中,也可以丢弃消息主体内容,而只保留标题和属性数据。默认情况下,停用消息队列存储完整的消息。

如果要减小停用消息队列的大小并且不打算恢复停用消息,请考虑将 imq.destination.DMQ.truncateBody 代理属性设置为 true

imqcmd update bkr -o imq.destination.DMQ.truncateBody=true

这将丢弃消息主体,而只保留标题和属性数据。

启用停用消息日志记录

默认情况下将禁用停用消息日志记录。启用停用消息日志记录使代理可以记录以下事件:

以下命令启用停用消息日志记录:

imqcmd update bkr -o imq.destination.logDeadMsgs=true

停用消息日志记录适用于使用停用消息队列的所有物理目的地。不能对单个物理目的地启用或禁用日志记录。