加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

IBM WebSphere MQ PCF管理接口介绍

(2011-01-13 16:48:14)
标签:

杂谈

分类: JAVA
WebSphere® MQ Programmable Command Formats (PCFs).

通常对MQ系统进行管理的方法包括MQSC,控制命令(Control Commands)等,为了完成管理工作,管理者往往需要登录到分布式环境的各个队列管理器上执行这些管理任务,而随着系统规模尺度的不断增长,管理由MQ构成的分布式网络变得越来越复杂。

MQ的日常管理工作包括:
  • 对象管理
  • 性能监控
  • 对象控制
  • 消息路由
借助PCF接口,管理者可以采用编程手段完成系统远程单点管理功能(只通过网络中的一个队列管理器进行整个网络的管理工作),进而简化上述系统管理工作。

PCF接口定义了一系列用于系统管理的命令及对应的响应消息格式,管理程序和(支持PCF的)队列管理器之间通过交换这些命令和消息完成管理任务:每个队列管理器都有一个管理命令队列(administration queue)和一个命令处理服务器(command server),管理程序将管理命令放到管理命令队列中,管理命令处理服务器处理这些命令并将命令执行结果放入到管理程序所指定的响应队列中,整个过程都通过标准的MQI调用完成。

管理命令队列的名称为SYSTEM.ADMIN.COMMAND.QUEUE。

除了通过标准的MQI接口发送和接收PCF消息外,MQ还专门提供了更为便捷的调用接口MQAI(MQ Administration Interface)。

PCF消息格式

一个PCF命令消息代表一个管理命令,由一个PCF消息头(PCF Header)和若干参数结构组成,消息头用于管理命令及其参数的标识,每个参数结构封装了一个管理命令的调用参数。同样,管理命令的执行结果由多个响应消息组成,每一个响应消息由PCF消息头和若干参数结构组成。管理命令消息头中的ReplyToQReplyToQMgr属性规定了命令处理服务器将管理命令的执行结果放到何处。

类型为MQCFT_COMMAND的命令消息只生成标准响应;类型为MQCFT_COMMAND_XR的命令消息生成标准响应或扩展响应(z/OS)。

如果命令中指定了多个对象名称,则响应中将会包含若干独立的消息,分别代表每一个对象执行命令的的结果,即一条针对多个对象的命令被作为多条针对单个对象的命令进行处理,以保证命令和响应之间的一一对应关系。

标准响应分为三种类型:OK、Error和Data。

OK响应包括所有消息头CompCode域取值为MQCC_OK或MQCC_WARNING的响应消息。MQCC_OK响应消息的消息头Reason域取值为MQRC_NONE;MQCC_WARNING响应消息的消息头Reason域包含了原因代码。

MQ对象命名规则

MQ中的身份验证信息(authentication information)、通道(channel)、客户端通道(client channel)、监听器(listener)、名称列表(namelist)、进程(process)、队列(queue)、服务(service)以及存储类(storage class)的对象分别处于不同的命名空间下,因此不同种类的对象可以重名而同种类型对象不能同名(例如本地队列不能与模型队列重名)。

MQ中的对象名称是大小写敏感的。一般的情况下,合法的对象名称可以包含大小写字符(A-Z,a-z)、阿拉伯数字(0-9)、点号(.)、正斜线(/)、下划线(_)、百分号(%);命名对象时注意,不要在名字中包含空格,避免在名称的首尾使用下划线。

MQ中的对象名称都有长度要求,如果名称未达到规定长度,则系统自动在名称的结尾补齐空格字符。队列、进程、名称列表、集群以及身份验证信息的名称最多48个字符,通道名称最多20个字符,存储类名称最多8个字符,CF结构名称最多12个字符。

所有以“SYSTEM.”开头的名称均作为保留名称供队列管理器使用,可以通过change命令进行修改。

SYSTEM.ADMIN.ACTIVITY.QUEUE 活动报告的队列
SYSTEM.ADMIN.CHANNEL.EVENT 通道事件的队列
SYSTEM.ADMIN.COMMAND.EVENT 命令事件的队列
SYSTEM.ADMIN.COMMAND.QUEUE 用于发送 PCF 命令消息的队列
SYSTEM.ADMIN.CONFIG.EVENT 配置事件的队列
SYSTEM.ADMIN.PERFM.EVENT 性能事件的队列
SYSTEM.ADMIN.QMGR.EVENT         队列管理器事件的队列
SYSTEM.ADMIN.TRACE.ROUTE.QUEUE 跟踪路由应答消息的队列
SYSTEM.AUTH.DATA.QUEUE         拥有队列管理器的访问控制表的队列。(不适用于 z/OS?)
SYSTEM.CHANNEL.INITQ         在 z/OS 上用于分布式排队的队列
SYSTEM.CHANNEL.SYNCQ         在 z/OS 上用于分布式排队的队列
SYSTEM.CICS.INITIATION.QUEUE 用于触发的队列(不用于 z/OS)
SYSTEM.CLUSTER.COMMAND.QUEUE 用于在队列管理器之间就存储库更改进行通信的队列(仅用于 AIX?、HP-UX、Linux?、i5/OS?、Solaris、Windows? 和 z/OS)

SYSTEM.CLUSTER.HISTORY.QUEUE 此队列用于存储集群状态信息历史(出于服务目的)。
SYSTEM.CLUSTER.REPOSITORY.QUEUE 用于保留有关存储库信息的队列(仅用于 AIX、HP-UX、Linux、i5/OS、Solaris、Windows 和 z/OS)

SYSTEM.CLUSTER.TRANSMIT.QUEUE 集群支持所管理的所有目标的传输队列(仅用于 AIX、HP-UX、Linux、i5/OS、Solaris、Windows 和 z/OS)

SYSTEM.COMMAND.INPUT         用于在 z/OS 上发送命令消息的队列
SYSTEM.COMMAND.REPLY.MODEL 用于命令应答的模型队列定义(用于 z/OS)
SYSTEM.DEAD.LETTER.QUEUE 死信队列(不用于 z/OS)
SYSTEM.DEFAULT.ALIAS.QUEUE 缺省别名队列定义
SYSTEM.DEFAULT.INITIATION.QUEUE 用于触发指定进程的队列(不用于 z/OS)
SYSTEM.DEFAULT.LOCAL.QUEUE 缺省本地队列定义
SYSTEM.DEFAULT.MODEL.QUEUE 缺省模型队列定义
SYSTEM.DEFAULT.REMOTE.QUEUE 缺省远程队列定义
SYSTEM.DURABLE.SUBSCRIBER.QUEUE 队列管理器中用于保存持久预订的持久副本的本地队列。
SYSTEM.HIERARCHY.STATE         发布/预订层次结构中用于保存队列管理器间关系状态的相关信息的队列

SYSTEM.INTERNAL.REPLY.QUEUE WebSphere MQ 内部应答队列(不用于 z/OS)
SYSTEM.INTER.QMGR.CONTROL 发布/预订层次结构中用于从远程队列管理器接收创建代理预订的请求的队列

SYSTEM.INTER.QMGR.PUBS         发布/预订层次结构中用于从远程队列管理器接收发布的队列
SYSTEM.INTER.QMGR.FANREQ 发布/预订层次结构中用于处理在远程队列管理器上创建代理预订的请求的队列
SYSTEM.MQEXPLORER.REPLY.MODEL 用于应答 MQ 资源管理器的模型队列定义
SYSTEM.MQSC.REPLY.QUEUE         用于 MQSC 命令应答的模型队列定义(不用于 z/OS)
SYSTEM.QSG.CHANNEL.SYNCQ 用于存储包含共享通道的同步信息的消息的共享本地队列(仅用于 z/OS)
SYSTEM.QSG.TRANSMIT.QUEUE 在相同队列共享组中的队列管理器之间传输消息时,组内排队代理程序所使用的共享本地队列(仅用于 z/OS)

SYSTEM.RETAINED.PUB.QUEUE        队列管理器中用于保存每个保留发布的副本的本地队列。
SYSTEM.SELECTION.EVALUATION.QUEUE       WebSphere MQ 内部选择求值队列(不用于 z/OS)
SYSTEM.SELECTION.VALIDATION.QUEUE WebSphere MQ 内部选择验证队列(不用于 z/OS)

以星号(*)结尾的名称表示多个对象,星号的含义是“以...开始”,因此"ABC*"表示以"ABC"开始的对象名称。MQ中只支持星号通配符,诸如问号(?)和冒号(:)等其它通配符不受支持。

PCF命令的身份认证

当命令服务器处理PCF命令时,命令消息描述符的UserIdentifier属性指定的用户将被用来进行身份验证,身份验证在命令实际执行的系统上进行,因此必须确保系统存在这个用户并且用户具备相应的权限。对于远程管理来说,这意味着本地和远程系统均需要包含相同的用户。

PCF命令定义

MQ常量(MQConstants)中包含了所有的PCF命令标识符,每一条PCF命令都对应着MQSC命令。

PCF命令和响应格式为:PCF头(MQCFH)和一系列参数结构。参数结构可以是:
PCF byte string filter parameter(MQCFBF
PCF byte string parameter(MQCFBS
PCF integer filter parameter(MQCFIF
PCF integer list parameter(MQCFIL
PCF integer parameter(MQCFIN
PCF string filter parameter(MQCFSF
PCF string list parameter(MQCFSL
PCF string parameter(MQCFST

MQAI

http://127.0.0.1:24401/help/topic/com.ibm.mq.csqzac.doc/pc15460a.gifWebSphere MQ PCF管理接口介绍" TITLE="IBM WebSphere MQ PCF管理接口介绍" />
http://127.0.0.1:24401/help/topic/com.ibm.mq.csqzac.doc/pc15480a.gifWebSphere MQ PCF管理接口介绍" TITLE="IBM WebSphere MQ PCF管理接口介绍" />

通过MQAI管理MQ的步骤为:
  1. 确定要进行的管理任务,例如修改队列;
  2. 查询特定命令和响应的格式和结构,例如队列对象的修改、创建和拷贝;
  3. 选择命令参数的选择器的取值;
  4. 使用mqCreateBag函数创建数据包,调用一系列mqAdd*函数设置选择器;
  5. 确定命令处理服务器正在运行;
  6. 调用mqExecute方法向命令服务器发送管理消息并等待响应。
更一般地,程序之间通过MQAI交换数据的步骤为:
  • 消息发送者
  1. 使用mqCreateBag创建数据包用于发送数据;
  2. 使用mqAddString或mqAddInteger方法向数据包中添加数据;
  3. 使用mqPutBag将数据包中的数据格式化为PCF消息格式,并且将消息放入响应的队列中。
  • 消息接收者
  1. 使用mqCreateBag创建数据包用于接收数据;
  2. 使用mqGetBag从队列中取出消息并构造数据包。
数据包(data bag)有四种:user bag、administration bag、command bag以及group bag。
数据项(data item)有八种:Integer、64-bit integer、Integer filter、Character-string、String filter、Byte string、Byte string filter和Bag handle。

使用Java编写MQ程序

配置队列管理器以接受客户机连接
  • 定义服务器连接通道
  1. 使用strmqm命令启动队列管理器;
  2. 运行runmqsc程序;
  3. 创建SVRCONN类型的通道,如:

DEF CHL('JAVA.CHANNEL') CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER(' ') +
DESCR('Sample channel for WebSphere MQ classes for Java')
  • 启动侦听器

runmqlsr -t tcp [-m QMNAME] -p nnnn

连接差别

客户机连接只支持TCP/IP连接;程序启动时不读取环境变量,取而代之采用MQEnvironment类传递参数;错误和异常信息写入MQException类指定的日志中,缺省为控制台;只支持客户机配置文件(mqclient.ini)中的部分属性;不支持MQBEGIN调用。

绑定方式支持MQBEGIN调用;实现到队列管理器的快速路经(fast path)功能;忽略MQEnvironment类中与绑定无关的大多数参数。

连接方式由MQEnvironment类中的两个变量设置确定:
  • MQEnvironment.properties
连接类型由MQC.TRANSPORT_PROPERTY表示,可以取值为:
MQC.TRANSPORT_MQSERIES_BINDINGS-绑定方式连接;
MQC.TRANSPORT_MQSERIES_CLIENT-客户机方式连接;
MQC.TRANSPORT_MQSERIES-由MQEnvironment.hostname属性确定连接方式。
  • MQEnvironment.hostname
对于客户机连接,设置为要连接的服务器主机名;
对于绑定方式,设置为空。

采用客户机连接方式的程序通过指定通道名称、主机名和端口号的方式连接队列管理器,指定方法有两种:
  • 设置MQEnvironment类的属性

MQEnvironment.hostname = "host.domain.com"; 

MQEnvironment.channel  = "java.client.channel";
默认情况下客户机会使用1414端口,如果队列管理器使用其它端口,可以通过以下方式指定:

MQEnvironment.port = nnnn;
  • 作为构造参数创建MQQueueManager对象。
构造属性键值分别为hostnamechannel 和(可选)port的Hashtable对象,并作为参数传入MQQueueManager对象的构造方法。

通过创建新的 MQQueueManager 类实例连接到队列管理器。通过调用 disconnect() 方法来断开与队列管理器的连接。如果调用 disconnect 方法,那么通过该队列管理器访问的所有打开的队列和进程都被关闭。但是,在使用完这些资源时显式地对它们进行关闭是一次很好的编程练习。为此,请使用相关对象上的 close() 方法。队列管理器上的 commit() 和 backout() 方法等价于与过程化接口一起使用的 MQCMIT 和 MQBACK 调用。

客户机通道定义表

通常MQ客户机通过环境变量MQSERVER指定客户机连接通道:


MQSERVER=ChannelName/TransportType/ConnectionName
如:

MQSERVER=CHANNEL1/TCP/9.20.4.56

在非 z/OS® 的平台上,客户机连接通道定义也存储在与服务器上运行的队列管理器相关联的客户机通道定义表中。 包含表的文件称为 AMQCLCHL.TAB,并且是一个无法直接编辑的二进制文件。可以使用 DEFINE CHANNEL 命令在表中添加客户机连接通道,使用 ALTER CHANNEL 命令改变表中已有条目的通道的属性。

也可以通过客户机通道定义表创建MQQueueManager对象:

java.net.URL chanTab1 = new URL("file:///home/admdata/ccdt1.tab");

java.net.URL chanTab2 = new URL("ftp://ftp.server/admdata/ccdt2.tab");

MQQueueManager mars = new MQQueueManager("MARS", chanTab2);
此语句使 WebSphere MQ classes for Java 客户机访问由 URL 对象 chanTab2 标识的客户机通道定义表,搜索该表以查找适合的客户机连接通道定义,然后使用通道定义启动 MQI 通道,此通道连接到名为 MARS 的队列管理器。

指定连接端口范围
当 WebSphere® MQ classes for Java™ 应用程序试图以客户机方式连接到 WebSphere MQ 队列管理器时,防火墙可能只允许来源于指定端口或一定范围内的端口的那些连接。在这种情况下,您可以指定应用程序可以绑定到的一个端口或端口范围。可通过下列方法来实现此目标:
  • 可以在 MQEnvironment 类中设置 localAddressSetting 字段。此处是一个示例:
    
    MQEnvironment.localAddressSetting = "9.20.0.1(2000,3000)";
    
  • 可以设置环境属性 MQC.LOCAL_ADDRESS_PROPERTY。此处是一个示例:
    
    (MQEnvironment.properties).put(MQC.LOCAL_ADDRESS_PROPERTY,
                                   "9.20.0.1(2000,3000)");
    
  • 如果可以构造 MQQueueManager 对象,那么您可以传递属性散列表,它包含值为“9.20.0.1(2000,3000)”的 LOCAL_ADDRESS_PROPERTY
在这些示例中,今后,当应用程序连接到队列管理器时,应用程序绑定到本地 IP 地址和端口号,范围为 9.20.0.1(2000) 到 9.20.0.1(3000)。

在具有多个网络接口的系统中,还可以使用 localAddressSetting 字段或环境属性 MQC.LOCAL_ADDRESS_PROPERTY 来指定必须将哪个网络接口用于连接。

如果您限制端口的范围,那么可能发生连接错误。如果发生错误,那么会抛出 MQException,它包含 WebSphere MQ 原因码 MQRC_Q_MGR_NOT_AVAILABLE 和以下消息

由于 LOCAL_ADDRESS_PROPERTY 限制,所以拒绝了套接字连接尝试
如果指定范围内的所有端口都在使用,或者如果指定的 IP 地址、主机名或端口号无效(例如,端口号为负数),那么可能会发生错误。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有