如何进行WebShpere MQ 运行故障的定位分析和排除(二)

您需要检查一下对方的MQ是否处于运行状态以及对方的通道侦听程序是否启动;如果错误日志显示”通道未在远程定义”,您可以检查您定义的通道的大小写是否正确等。

2 常见故障分析

在开始详细分析问题的原因之前,我们应该首要考虑一下可能导致问题的一些较明显的因素,或导致问题发生的最大可能性因素,这样便于把分析问题的范围限制到最小。

如前所述,有关的MQ的异常情况的发生,通常主要与三方面的因素有关,即:

MQSeries本身

网络

客户的应用

2.1 初步分析

当出现问题时,可从这三方面着手分析原因,这里,列举了一些基本问题,您可以按照此顺序来查找问题的原因。

  • 在此之前MQ是否运行正常?
  • 从最近一次成功运行以来,是否在某些地方作过改动?
  • 在此之前,应用是否运行成功?
    如果您的系统曾经运行正常,那麽在出现问题之前,您对哪些部分做了改动,如:有的用户可能由于网络重新规划而更改了某个主机的IP地址,则可能导致通道无法连通;有的用户新设置了防火墙,则需要进行相应的配置,才能使MQ的通道运行正常。如果您没有对系统配置做过更改,您可以分析是否运行环境发生了变化,如:是否由于业务量的加大导致应用程序队列满了,您需要加大队列的最大深度;是否由于连接数量的增加,导致无法建立新的连接,这时,您需要察看在队列管理器配置文件中,与通道相关的MaxChannels和MaxActiveChannels的配置是否足够大。
  • 有无错误信息?
    可以察看错误日志,得到错误信息。
  • 是否与MQI应用有关,利用返回码能否解释原因?
    对于每一个函数调用,MQ都会返回一个Completion Code和Reason Code,通过MQI返回码Reason Code,可以在API一层,确定错误原因,Reason Code代表的含义可以参考编程手册,或者从h头文件中获得。如:RC2035,代表没有操作权限;RC2085,表示没有该对象;RC2080,表示应用程序给出的buffer小于消息的实际大小等。
  • 问题能再现吗?
  • 从最近一次成功运行以来,是否在某些地方作过改动?
  • 在此之前,应用是否运行成功?
  • 网络是否连接正常?
  • 问题是否总在每天的某一固定时刻发生?

2.2 深入分析

如果初步分析无法解决问题,您必须更进一步查找原因,您可以近一步考虑如下问题:

2.2.1 与队列相关的问题

1) 队列状态是否正常?

  • 用DISPLAY QUEUE命令查看队列的各项状态
  • 用得到的队列信息进一步查看:
    a) 如果CURDEPTH达到MAXDEPTH,表明队列深度已满,新消息已不能再进入队列,要及时处理队列中积存的消息;或者增大队列的MAXDEPTH属性。 b) 如果CURDEPTH还没有达到MAXDEPTH,再考虑以下两种情况:
    如果队列被设置为可触发类型的,要检查触发条件有没有满足?相关触发进程的定义是否正确?如果队列不是触发类型的,要检查队列是否为可共享的,是否允许PUT或GET的操作等。

2) 消息是否成功地放入队列?

如果消息没有成功地放入队列,您可以检查:

  • 队列是否被正确定义?例如,队列的MaxMsgLength属性是否足够大以容纳所需大小的消息?
  • 队列是否被允许放入?
  • 队列是否已满?这可能意味着应用程序无法将要求的消息放入队列。
  • 有没有另一个应用程序取得了独占队列的权力?

3) 你是否可以从队列取出任何消息?

如果你无法从队列中取出任何消息,检查:

  • 其他应用程序能否从队列中取出消息?
  • 有没有另一个应用程序取得了独占队列的权力?

如果你正在开发应用程序,检查:

  • 你是否需要使用一个同步点? 如果使用同步点控制来放入或检出消息,它们直到工作单元被提交前不能用于其它任务。
  • 是否等待了足够长的时间? 作为MQGET调用的一个选项,你可以设置等待间隔。你应该确保等待响应足够长的时间。
  • 你是否在等待一条由消息或相关标识符(MsgId或CorrelId)标识的特定消息?

检查你在等待的消息的MsgId或CorrelId是否正确。成功的MQGET调用会把这些值设置为检索到的消息的值,所以你可能要重设这些值以便成功地取出另一条消息。

  • 您对消息是否进行了分段处理,您是否在利用MQGET读取消息时,采用了正确的选项(MQGMO),从而获取消息的整体。
  • 还要检查一下你是否能够从队列中取出另一条消息。
  • 你期望的消息有没有被定义为持久的? 如果没有,并且MQ重新启动后,消息将已丢失。

4)问题是否与远程队列有关?

如果问题是否与远程队列有关,则要考虑以下几个方面:

  • ¢ 远程队列的定义是否正确;
  • 检查通道是否启动,如果通道是可被触发的,要检查触发监视器是否运行正常;
  • 检查往远程队列里发送消息的应用程序是否运行正常;
  • 从错误日志中查找信息;

2.2.2 与通道相关的问题

MQSeries的通道是MQ的重要组成部分,是MQ的难点和精华,它运行正常与否对MQ系统的正常运行起着致关重要的作用,并且,在MQ的网络环境中,相当数量的异常问题与通道有关,因此,相比而言,对MQ通道的维护工作是MQ系统管理员系统管理工作的重点。下面,我们给出当通道出现异常时,判断通道状态、分析问题原因、以及解决通道问题的途径和基本手段。

这里先给出有关通道的几个基本概念:

1) 通道状态

通道状态有binding、running、stopping、stoped、retrying等几种类型,当我们发出启动通道的命令之后,通道进入binding的状态,若网络连接畅通并且通道定义正确,它进入正常running状态;而在异常情况下,比如网络连接有问题、通道定义不正确或通道两端的消息序列号(Message Sequence Number)不匹配等,通道即进入retrying的状态,它会根据通道定义中short retry和long retry的次数和时间间隔依次进行short retry和long retry,若不成功,则通道无法正常启动。

2) 消息序列号(Message Sequence Number)

以下文章点击率最高

Loading…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注