跳转至主要内容

OpenVOS操作系统提供了一个高级应用编程接口(API),总体上使系统编程变得简单。 但有时,它变得容易--因为对s$...例程的一个简单的子程序调用可能隐藏了很多复杂的东西。 用户有时并没有意识到,简单的调用可能会导致大量的工作,可能会给系统和应用程序带来问题。

这是一个不定期的系列文章中的第二篇,目的是提醒你注意在你的应用设计中可能避免的陷阱。

服务器队列中list_messages的弊端。

OpenVOS中的list_messages命令旨在与作为OpenVOS事务保护产品一部分的队列一起使用。 StrataDOCfor OpenVOS会显示这个命令"显示指定队列中的消息信息"。 所以当队列开始在生产中备份时,你可能会想用这个命令找出队列中的消息有多少。 -totals_only选项看起来就像需要的那样。 一旦你了解了这个命令的操作,你就会明白为什么这不是一个好的选择。

List_messages命令的操作方法

该命令将一个端口附加到文件上,并以SERVER_TYPE(或RECV_ONLY_SRV_TYPE为单向服务器队列)的形式打开该端口,并将其置于no_wait_mode。 如果队列是事务保护的,那么该命令就会以优先级-1启动一个事务,这意味着如果有争执的话,它将永远输掉,当它完成时,它会调用s$abort_transaction。

接下来,它从队列中的第一条记录开始,并继续调用 s$read_msg,对它能够接收到的每一条记录进行计数,然后对记录进行计数和/或转储到输出端口。

为了显示每条消息的信息,它必须查找发起消息的模块和进程的信息。

最后,它打印出它在队列中找到的记录的总数。

这种方法的问题

该命令的目的是让应用开发程序员在消息处于队列中时,用来查看消息,以确定消息的格式是否正确,是否包含正确的字段,是否以正确的优先级排队,是否已被服务器接收等。 然而,当该命令用于其他目的时,有许多限制和隐藏/误导数据。

  • 要获取队列中的消息信息,你必须有执行、读或写的权限。如果你有对队列的执行或读取权限,你只能得到关于你的消息的信息。如果你有写访问权限,你可以得到所有消息的信息。
  • 如果队列是服务器队列,list_messages只列出那些还没有被服务器回复的消息。已经被回复但尚未被s$msg_receive_reply从队列中移除的消息不会被列出。
  • 队列可能已经满了(max_queue_depth),并且不再接受任何新的消息,但是如果所有的消息都是未收到的回复,那么list_messages可能会在队列中显示零条消息。
  • 由于list_messages命令在检索消息的同时,会作为队列的服务器出现,所以可能会欺骗客户机和其他控制进程,让他们不知道服务队列的服务器数量。
  • 如果请求者在不同的模块上,检索请求者进程的模块和进程信息可能需要网络事务。
  • 每条消息都需要进入内核读取消息。 如果该命令不是从拥有队列的模块中运行,那么就需要一个网络事务来读取每条消息。
  • 即使指定了-totals_only,也必须读取每条信息才能进行计算。
  • 由-totals_only显示的值只针对为服务器排队或正在由服务器处理的消息。 对于仍在队列中的双向服务器队列消息,不显示未收到的回复信息,这使得-totals_only的值具有误导性。
  • 信息中的数据可能是敏感信息(如信用卡账号)。

不同的方法

1990年,提供了一个新的API:s$get_server_queue_info。 给定一个队列的路径名,这个例程返回一个结构,其内容为

  • 服务器队列的种类(单向或双向)。
  • 信息的数量
  • 非繁忙信息的数量
  • 信息量最大
  • 已处理的信息总数。
  • 为该队列配置的最大邮件数量(max_queue_depth)。

与list_messages相比,这个例程有很多优势。

  • 一次进入内核和/或通过网络检索总数信息。
  • 审议各种信息,包括尚未收到的答复;
  • 不中断队列。 队列头被锁定的时间为微秒,刚好够从队列头中得到一组一致的五个计数器。
  • 当队列作为请求者打开时,可以获得信息。

check_queue_depth 命令

很多年前,我写了check_queue_depth,这个命令使用了这个接口,你不仅可以使用它来显示一个或多个队列的这些信息,而且当达到阈值时,它还可以监控和警告。

Check_queue_depth 队列 [-warn_percent number] [-interval number]。
                         [-notify user_name] [-brief] [-long]
                         [-ignore_invalid_type] [-syserr] 。
                         [-exit_after_warning]

该命令的源代码可在Stratus 公共FTP站点上获得。

欢迎使用它,增强它,和/或将它嵌入到您自己的应用程序监控命令中。

© 2024Stratus Technologies.