Sun Java System Message Queue 3.7 UR1 管理指南

停用消息队列包含消息

症状:


Listing all the destinations on the broker specified by:
---------------------------------
Host         Primary Port
---------------------------------
localhost    7676
----------------------------------------------------------------------
   Name     Type    State   Producers  Consumers  Msgs
                                         Total    Count  UnAck  Avg Size
------------------------------------------------- ----------------------
MyDest      Queue  RUNNING       0          0        5      0    1177.0
mq.sys.dmq  Queue  RUNNING       0          0       35      0    1422.0
Successfully listed destinations.

在本示例中,停用消息队列 mq.sys.dmq 包含 35 条消息。

可能的原因:

可能的原因:消息的数目或者其大小超出目的地限制。

确认问题的起因:使用 QBrowser 演示应用程序来查看停用消息队列的内容。要了解 QBrowser 演示程序特定于平台的位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置并查看“示例应用程序和位置”表。

下面是 Windows 平台中的一个调用示例:

cd \MessageQueue3\demo\applications\qbrowser java QBrowser

QBrowser 主窗口出现后,选择队列名称 mq.sys.dmq,然后单击 "Browse"。将会出现如前面“消息超时值即将到期”中所示的列表。双击消息可显示该消息的详细信息,如“消息超时值即将到期”中所示。

请注意下列消息属性的值:

请注意 JMS 标题下面的 JMSDestination 值,以确定消息将停用的目的地。

解决此问题:增加目的地限制。例如:

imqcmd update dst - n MyDest -o maxNumMsgs=1000

可能的原因:代理时钟和生成方时钟不同步。

确认问题的起因:使用 QBrowser 应用程序来查看停用消息队列中各消息的详细信息。检查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值,查找原因为 EXPIRED 的消息。

在代理日志文件中,查找下列任一消息:B2102 B2103B2104。这些消息均报告检测到可能的时钟脉冲相位差。

解决此问题:检查您是否正在运行时间同步程序,如准备系统资源中所述。

可能的原因:消息超时前,使用方未接收到消息。

确认这是否就是问题的起因:使用 QBrowser 应用程序来查看停用消息队列中各消息的详细信息。检查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值,查找原因为 EXPIRED 的消息。

检查目的地中是否有任何使用方。例如:

imqcmd query dst -t q -n MyDest

检查列出的“当前活动使用方”值。如果有活动使用方,则下面的某一项为真:

解决此问题:请求应用程序开发者提高消息的生存时间值。

可能的原因:相对使用方数目而言,生成方太多。

确认问题的起因:使用 QBrowser 应用程序来查看停用消息队列中各消息的详细信息。检查 JMS_SUN_DMQ_UNDELIVERED_REASON 的值。如果原因是 REMOVE_OLDESTREMOVE_LOW_PRIORITY,请使用 imqcmd query dst 命令来检查目的地中的生成方和使用方的数目。如果生成方的数目超过使用方的数目,则生成率可能会远远超出使用率。

解决此问题:添加更多的使用方客户端,或者使用如下所示的命令,将目的地限制行为设置为 FLOW_CONTROL(该限制行为通过使用率来控制生成率):

imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL

可能的原因:生成方比使用方的速度快。

确认问题的起因:要确定较慢的使用方是否会导致生成方的速度降低,请使用如下所示的命令,将目的地限制行为设置为 FLOW_CONTROL(该限制行为通过使用率来控制生成率):

imqcmd update dst -n myDst -t q -o consumerFlowLimit=FLOW_CONTROL

使用如下所示的命令,使用度量来检查目的地的输入和输出:

imqcmd metrics dst - n myDst -t q -m rts

在度量输出中,检查以下值:

由于流控制使生成与使用协调一致,因此请注意生成是否减慢或停止。如果生成减慢或停止,则说明生成方和使用方的处理速度不一致。也可以使用 imqcmd list dst 命令,检查未确认的 (UnAcked) 发送消息的数目。如果未确认的消息数目小于目的地大小,则表明目的地尚有额外的容量,它受到客户端流控制的抑制。

解决此问题:如果生成率始终高于使用率,可以考虑有规律地使用流控制以使系统保持协调一致。此外,使用后面各节的内容,考虑并尝试消除下列可能的因素:

可能的原因:使用方太慢。

确认问题的起因:使用度量来确定生成和使用的速率,如前面“生成方比使用方的速度快”中所述。

解决此问题:

可能的原因:客户端不提交消息。

确认问题的起因:与应用程序开发者进行确认以查明应用程序是否使用事务。如果应用程序使用事务,则按如下所示列出活动事务:

imqcmd list txn

下面是一个命令输出示例:


----------------------------------------------------------------------
Transaction ID       State    User name  # Msgs/# Acks   Creation time
----------------------------------------------------------------------
6800151593984248832  STARTED  guest           3/2     7/19/04 11:03:08 AM

请注意消息和确认的数目。如果消息的数目很高,则生成方可能正在发送个别的消息,而未能提交事务。代理在收到提交之前,无法路由并传送该事务的消息。如果确认的数目很高,则使用方可能正在发送个别消息的确认,而未能提交事务。代理在收到提交之前,无法删除该事务的确认。

解决此问题:联系应用程序开发者以修复编码错误。

可能的原因:使用方未能确认消息。

确认问题的起因:联系应用程序开发者以确定应用程序使用的是基于系统的确认还是基于客户端的确认。如果应用程序使用基于系统的确认,则跳过本节;如果应用程序使用基于客户端的确认 (CLIENT_ACKNOWLEDGE),请先使用如下命令减少客户端中存储的消息数:

imqcmd update dst -n myDst -t q -o consumerFlowLimit=1

其次,确定是因为代理由于使用方速度慢而缓冲消息,还是因为使用方处理消息的速度很快但未对其进行确认。使用以下命令列出目的地:

imqcmd list dst

在提供用户名和密码后,将显示类似以下内容的输出:


Listing all the destinations on the broker specified by:
---------------------------------
Host         Primary Port
---------------------------------
localhost    7676
----------------------------------------------------------------------
   Name     Type    State   Producers  Consumers  Msgs
                                         Total    Count  UnAck  Avg Size
------------------------------------------------ -----------------------
MyDest      Queue  RUNNING       0          0        5    200    1177.0
mq.sys.dmq  Queue  RUNNING       0          0       35      0    1422.0
Successfully listed destinations.

未确认数值表示代理已发送且正在等待确认的消息数。如果此数值较高或不断增加,则说明代理正在发送消息,因此不等待速度较慢的使用方。还说明使用方未确认消息。

解决此问题:联系应用程序开发者以修复编码错误。

可能的原因:长期使用方处于非活动状态。

确认问题的起因:使用以下命令格式查看主题的长期订户:

imqcmd list dur -d topicName

解决此问题:

可能的原因:发生意外的代理错误。

确认问题的起因:使用 QBrowser 对消息进行检查,如前面“生成方比使用方的速度快”中所述。如果 JMS_SUN_DMQ_UNDELIVERED_REASON 的值是 ERROR,则说明代理发生错误。

解决此问题: