![]() | |
Sun Java System Message Queue 3 2005Q1 管理指南 |
第 6 章
管理物理目标Message Queue 消息通过代理上的物理目标路由到其使用方客户机。代理管理与物理目标关联的内存和持久性存储器并设置其行为。
在群集中,您在某个代理上创建一个物理目标,然后群集会将该物理目标传播到所有代理。应用程序客户机可以订阅某一主题,或者使用来自群集中任何代理上的队列的主题,因为这些代理会协同工作将消息路由到整个群集。但是,只有最初生成消息的代理管理该消息的持久性和确认。
本章说明如何执行以下任务:
表 13-5 中提供了用于管理物理目标和完成上述任务的 imqcmd 子命令的完整参考信息。
注
每当与物理目标交互时,客户机应用程序就会使用 Destination 对象。为了实现提供者无关性和可移植性,客户机通常使用管理员创建的目标对象,它们被称为目标受管理对象。可以配置受管理对象以用于客户机应用程序,请参见第 8 章“管理受管理对象”。
使用 imqcmd 命令实用程序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-4 中。
创建物理目标
列出物理目标可以获得有关物理目标的当前属性值、物理目标相关的生产方和使用方的数量、以及消息传送度量(如物理目标中消息的数量和大小)的信息。
要查找希望获取其信息的物理目标,请列出代理中的所有物理目标。要执行此操作,请使用 list dst 子命令。下面是 list dst 子命令的语法:
list dst [-t destType] [-tmp]
该命令列出指定类型的物理目标。目标类型 (-t) 选项的值可以是 q(队列)或 t(主题)。
如果省略目标类型,则会列出所有类型的物理目标。
list dst 子命令可选择性地指定要列出的目标类型或选择性地包含临时目标(使用 -tmp 选项)。临时目标由客户机创建,通常用于接收发送到其他客户机的消息回复。
例如,要获得在 myHost 4545 端口上运行的代理中的所有物理目标列表,请输入以下命令:
imqcmd list dst -b myHost:4545
除任何其他物理目标外,始终会显示停用消息队列 mq.sys.dmq,除非指定目标类型 t 只包括主题。
显示有关物理目标的信息要获得有关物理目标当前属性值的信息,请使用 query dst 子命令。下面是 query dst 子命令的语法:
query dst -t destType -n destName
此命令列出有关指定类型和名称的目标的信息。例如:
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 “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
销毁物理目标将清除该目标中的所有消息并将该目标从代理上删除,此操作是不可逆的。
不能销毁停用消息队列。
压缩物理目标如果使用内置的、基于文件的数据存储库(相对于插入的 JDBC 兼容数据存储库)作为消息的持久性存储,可以监视磁盘的利用率并在需要时压缩磁盘。
可构建基于文件的消息存储,以便根据消息所在的物理目标将其存储在目录中。在每个物理目标的目录中,大多数消息存储在一个文件中,该文件由大小可变的记录组成,即大小可变的记录文件。(为减少文件碎片,大小超过可配置的阈值的消息将存储在其自身的单独文件中。)
由于各种大小的消息可保持持久,并随后从大小可变的记录文件中删除,因而可能会在文件中出现漏洞,即文件中的空闲记录无法重新使用。
要管理未使用的空闲记录,命令行实用程序可包含用于监视每个物理目标的磁盘占用的子命令,以及在磁盘占用降低时用于回收空闲磁盘空间的子命令。
监视物理目标的磁盘占用
要监视物理目标的磁盘占用情况,请使用如下所示的命令:
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 代理属性,可允许或禁止代理中所有自动创建的物理目标使用停用消息队列。
配置和管理停用消息队列
imqcmd 命令实用程序用于管理停用消息队列。管理停用消息队列与管理其他队列相似,但有一些不同之处。例如,由于停用消息队列是系统创建的,因而不能创建、暂停或销毁该队列。
停用消息队列属性
配置停用消息队列与配置其他队列相似,但某些物理目标属性不应用默认值或具有不同的默认值。表 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
停用消息日志记录适用于所有使用停用消息队列的物理目标。不能为单个物理目标启用或禁用日志记录。