| |
| Sun Java System Message Queue 3 2005Q4 管理指南 | |
第 6 章
管理物理目标本章介绍如何使用 imqcmd 实用程序管理物理目标。Message Queue 消息通过代理上的物理目标路由到使用方客户端。代理管理与物理目标关联的内存和持久性存储器并设置它们的行为。
在群集中,您在某个代理上创建一个物理目标后,群集会将该物理目标传播到所有代理。应用程序客户端可以订阅某一主题,或者使用群集中任何代理上的队列,因为这些代理会协同工作,在整个群集中路由消息。但是,该消息的持久性和确认只由最初生成消息的代理负责管理。
本章包含以下主题:
表 13-5 中提供了用于管理物理目标和完成上述任务的 imqcmd 子命令的完整参考信息。
有关物理目标的介绍,请参见 Message Queue 技术概述。
注
每当与物理目标交互时,客户端应用程序都会使用 Destination 对象。为了实现提供者无关性和可移植性,客户端通常使用管理员创建的目标对象,它们被称为目标受管理对象。可以配置受管理对象,使其可供客户端应用程序使用,如第 8 章“管理受管理对象”中所述。
使用命令实用程序可以使用 Message Queue 命令实用程序 (imqcmd) 来管理物理目标。imqcmd 命令的语法与管理其他代理服务时的语法一样。
有关 imqcmd 及其子命令和选项的完整参考信息,请参见第 13 章“命令行参考”。
子命令
表 6-1 列出了 imqcmd 子命令,本章介绍了这些子命令的用法。有关这些子命令的参考信息,请参见物理目标管理。
创建物理目标要创建物理目标,请使用 imqcmd create 子命令。下面是 create 子命令的语法:
create dst -t destType -n destName [-o property=value] [-o property=value1]...
创建物理目标时,请指定以下内容:
也可以在更新物理目标时设置属性。
许多物理目标属性都影响代理的内存资源和消息流。例如,可以指定能发送到物理目标的生成方数量,它们可以发送的消息数量和大小,以及达到物理目标限制时代理应做出的响应。这些限制与由代理配置属性控制的代理范围的限制类似。
以下属性既适用于队列目标,也适用于主题目标:
- maxNumMsgs。指定物理目标中允许的未使用消息的最大数量。
- maxTotalMsgBytes。指定物理目标中允许用于未使用消息的内存的最大总量(以字节为单位)。
- limitBehavior。指定当达到内存限制阈值时代理的响应方式。
- maxBytesPerMsg。指定物理目标中允许的任何单个消息的最大大小(以字节为单位)。
- maxNumProducers。指定物理目标的生成方的最大数量。
- consumerFlowLimit。指定在一批中传送给使用方的消息的最大数量。
- isLocalOnly。仅适用于代理群集。指定物理目标不能在其他代理上复制,因而限定只能将消息传送到本地使用方(连接到创建物理目标的代理的使用方)。
- useDMQ。指定是丢弃物理目标的停用消息,还是将其放在停用消息队列中。
以下属性只适用于队列目标:
有关物理目标属性的完整参考信息,请参见第 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
此命令将产生类似如下内容的输出:
输出还显示与目标关联的生成方和使用方的数量。对于队列目标,该数量包括活动使用方和备份使用方。
可以使用 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 襪axBytesPerMsg=1000�
-o 襪axNumMsgs=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
此命令产生如下所示的输出:
--------------------------------------
保留的 已用的 利用率
--------------------------------------
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)。
回收未使用的物理目标磁盘空间
如果未指定目标类型和名称,则会为所有物理目标执行此操作。
配置停用消息队列的使用停用消息队列 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
在代理群集中,停用消息队列始终是本地物理目标,此属性永久性地设置为 true。但是,本地代理的停用消息队列可包含由群集中其他代理的客户端生成的消息(如果本地代理将这些消息标记为停用)。
消息内容
代理可以将完整的消息放入停用消息队列中,也可以丢弃消息主体内容,而只保留标题和属性数据。默认情况下,停用消息队列存储完整的消息。
如果要减小停用消息队列的大小并且不打算恢复停用消息,请考虑将 imq.destination.DMQ.truncateBody 代理属性设置为 true:
imqcmd update bkr -o imq.destination.DMQ.truncateBody=true
这将丢弃消息主体,而只保留标题和属性数据。
启用停用消息日志记录
默认情况下将禁用停用消息日志记录。启用停用消息日志记录使代理可以记录以下事件:
以下命令启用停用消息日志记录:
imqcmd update bkr -o imq.destination.logDeadMsgs=true
停用消息日志记录适用于使用停用消息队列的所有物理目标。不能对单个物理目标启用或禁用日志记录。