2004 年 2 月 01 日
在广大用户使用MQ的过程中,大家比较常用而且比较熟悉的是有关MQI的编程,即利用MQ应用程序接口进行消息的发送和接收,而大家对MQ的系统管理编程可能比较陌生,希望得到更多这方面的知识和技巧,本文将向大家介绍该方面的编程内容和技巧。
在广大用户使用MQ的过程中,大家比较常用而且比较熟悉的是有关MQI的编程,即利用MQ应用程序接口进行消息的发送和接收,以C语言为例,最为常见的是使用MQCONN, MQOPEN, MQPUT/MQGET, MQCLOSE, MQDISC等函数进行队列的读写操作;而大家对MQ的系统管理编程可能比较陌生,希望得到更多这方面的知识和技巧,本文将向大家介绍该方面的编程内容和技巧。
所谓的MQ系统管理编程是指使用MQ提供的编程接口,编制特定的应用程序,来进行对MQ各种对象的监控和管理,如:查询通道的状态、队列的深度等运行时状态,查询队列管理器的属性,队列的属性或通道的属性等静态参数;以及对MQ进行各种操作,如:启动/停止通道,创建/删除各种对象,修改各种对象的属性等。
实际上,MQ为我们提供了多种系统管理的手段,其中包括:
- 利用MQ的图形管理界面进行操作、监控和管理:MQ资源管理器为用户提供了良好的管理界面,从而方便用户对中间件系统的配置和管理工作,通过MQ资源管理器,用户可以定义、修改、删除中间件的各种资源、对象,察看各种对象的属性,监控各种对象的运行状态;
- 利用MQSC命令,通过命令行的方式对MQ进行操作、监控和管理,尤其值得一提的是MQSC命令在各个平台上都是相同的,在一个有若干平台共存的系统中大大地方便和简化了系统管理的工作。
- 通过特定的系统管理工具进行监控和管理,MQ不仅自身提供了GUI和文本化监控工具来监测和显示对象的状态,并且能够利用各类系统管理软件对整个网络运行状况实施监控;如Tivoli Manager for MQ就是一个功能强大的综合管理工具:它为控制消息和应用程序框架提供了一个集中管理平台。它捕获和显示MQ的事件,并能发现新的队列管理器以及相应的对象,这些对象可以通过中央控制台进行定义和配置。除此之外,许多第三方厂家也提供有类似的管理工具。
除了以上这三种管理手段之外,MQ还提供了系统管理的编程接口,通过该接口用户可以编写应用程序从而进行自动化的实时监控及管理。MQ的系统管理接口有两种,即Programmable Command Format(可编程命令格式,简称PCF)和MQ Administration Interface(MQ管理接口,简称MQAI)。下面,我们分别介绍这两种编程接口的原理和使用。
第一部分:WebSphere MQ 可编程命令格式(PCF)
WebSphere MQ 可编程命令格式(PCF)命令使得管理任务能编写到应用程序中,在程序中可以创建队列、进程等对象的定义以及更改对象的属性等。
PCF定义了命令和回复消息,应用程序通过这些命令和回复消息实现和队列管理器之间的信息交换,PCF 命令和MQSC 命令具有相同的命令集,所有通过MQSC命令能够实现的功能,通过PCF都可以实现,因此,通过WebSphere MQ的应用程序可以实现对MQ对象的管理包括:队列管理器,进程定义,队列和通道等。PCF命令可以被发送到本地队列管理器的命令队列,也可以被发送到某个远程队列管理器的命令队列,因此,应用程序可以通过一个本地队列管理器集中管理网络中的任何本地和远程管理器。
MQ的远程管理机制底层就是通过PCF这种方式的,在互相联接的系统中的任意一个节点都可以进行对其他所有节点的配置和管理,这种情形的典型应用就是通过一台Windows操作系统的机器来管理全网的MQ节点。由于MQ在Windows XP/NT/2000平台上提供了图形界面的管理工具,我们可以把一个节点设成管理机,利用管理机可以监控和配置网络中的任一节点,监测和显示整个网络中任何一个节点上的服务器及其各种对象的状态和运行情况,从而实现对中间件的集中管理和监控。
每一个队列管理器有一个名为SYSTEM.ADMIN.COMMAND.QUEUE的管理队列,应用程序可以按照PCF命令消息格式封装的要求,组成PCF消息,并将该PCF命令消息发送到管理队列中,同时,每一个队列管理器也有一个命令服务器(Command Server),它为管理队列中的消息提供服务,在我们使用MQ的控制命令strmqcsv启动命令服务器之后,它将监控管理队列,一旦该队列中有PCF消息到达,它将读取该消息,并解释执行。因此在网络中的任何队列管理器都可以处理PCF消息,通过使用指定的回复队列,回复消息可以被返回给应用程序,应用程序可以获知PCF命令执行成功与否。回复队列由命令消息的消息描述符(MQMD)中的ReplyToQ和ReplyToQMgr两个字段来指定。
PCF命令和回复消息是使用MQ相应的编程接口进行发送和接收的,以C语言为例,我们只需要使用MQPUT将PCF命令消息发送到相应的管理队列,使用MQGET将PCF回复消息从相应的回复队列中取出即可。这里的关键就是如何封装PCF消息。每个MQ指令及其相关参数都是一条单独的命令消息,每个命令消息由PCF头和若干个参数结构块组成,每个参数结构块提供了命令的参数。回复消息的结构与命令消息相同,但是回复消息的个数根据不同的情况可能会有多个,例如:如果我们查询某个队列管理器下所有本地队列的属性,假设本地队列有10个,那么我们将得到10个回复消息,PCF头中的Control字段MQCFC_NOT_LAST和MQCFC_LAST将用于区分是否为最后一个回复消息。
PCF编程接口支持C,Visual Basic, COBOL, RPG, PL/1和Java等,其中在我们最常用的编程语言中,C和Visual Basic编程在PCF的封装上相对Java将会略微复杂一些。
PCF头用来描述希望执行的PCF命令以及紧接PCF头之后的参数结构块的个数,例如:如:MQCMD_INQUIRE_Q 的PCF命令用来查询队列的属性,MQCMD_INQUIRE_CHANNEL_STATUS用来查询通道的运行状态;当希望查询通道的状态时,我们要指出欲查询通道的名称以及类型,这样将会有2个参数结构块。
在PCF头之后紧接着是各个参数结构块,参数结构块有PCF String, PCF Integer, PCF Integer List,PCF String List四种类型。通常情况下,PCF String用来描述PCF命令要操作的对象的名称,例如,若我们要查询名为TEST通道的状态时,我们要将PCF String的通道名称设置为TEST;PCF Integer用来描述PCF命令要操作的对