Chinaunix首页 | 论坛 | 博客
  • 博客访问: 575242
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:13:05

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置
 
级别: 中级
 
 
规划 WebSphere MQ 实现
 

本部分讨论在规划 WebSphere MQ 实现时要考虑的事项和必须作出的决策。

WebSphere MQ 安装中的对象(队列管理器、队列,等等)命名是您应该在规划活动中处理的第一件事情。在开始实现之前,应该就名称和命名约定达成一致。

WebSphere MQ 名称的限制包括:

  • 只允许使用以下字符:A-Z、a-z、0-9、.(句点)、/、_(下划线)、%
  • 以下对象的名称最多只允许 48 个字符:
    • 队列管理器
    • 队列
    • 流程
  • 通道名称最多只允许 20 个字符。

WebSphere MQ 对象名称并不暗示任何对象结构。WebSphere MQ 中的所有名称都区分大小写





安装后,要创建的第一个 WebSphere MQ 对象是队列管理器。通常,您只需为每台计算机创建一个队列管理器,但是可以创建其他队列管理器(例如用于测试目的)。

每个队列管理器都有一个名称,该名称在彼此交换消息的队列管理器网络中应该唯一。当队列管理器生成标识符时,队列管理器使用其名称的前 12 个字符作为唯一消息标识符的一部分。

队列管理器名称通常较短。它们通常被赋予与 TCP/IP 主机名称相同的名称、与 Windows 系统名称相同的名称或与 SNA LU 别名相同的名称,或其他某个表示与某台特定计算机关联的名称。





存在一些用于命名队列的有用约定:

  • 队列的名称不应该包含其类型或位置的指示。这样,如果某个队列从本地队列更改为远程队列,您仍然可以对该队列使用同样的名称,并且引用该队列的应用程序不需要更改。相反,队列的名称应该描述其功能。

  • 对相关队列名称使用公共前缀可以为管理提供帮助。例如,允许执行搜索以查找与特定应用程序相关的所有队列。





有一些本地队列在 WebSphere MQ 中具有特殊用途:

死信队列
一个指定队列,队列管理器将把无法传递的消息放到该队列上。队列管理器拥有死信队列并不是强制性的,但是强烈建议使用死信队列。
启动队列
用于实现触发。您将在后面的触发部分看到更多详细信息。
传输队列
正如您在本系列的第 1 部分中所看到的,传输队列与消息通道合作以支持队列管理器到队列管理器的通信。Usage 属性指示将一个本地队列用作传输队列。
命令队列
从本地或远程运行的管理应用程序接收 WebSphere MQ 命令。
事件队列
如果队列管理器检测到某个检测事件,并且是队列管理器中的某种重要事件,例如错误或警告,此时它会在事件队列上放置一条描述该事件的事件消息。事件队列可通过系统管理应用程序来监视,后者获得事件消息并采取适当的操作。
缺省队列
确定所创建的任何新队列的缺省属性值。四种队列类型中的每一种类型都有一个缺省队列:本地、别名、远程和模型。因此,您只需在队列定义中包括那些其值与缺省值不同的属性。只需重新定义相应的缺省队列即可更改属性的缺省值。





您在第 1 部分中了解到,消息通道 是两个队列管理器间用于消息传输的单向链接。它由发送端的消息通道代理 (MCA) 和接收端的 MCA 以及两者间的通信协议组成。

消息通道的每一端具有单独的定义。两个定义都包含该消息通道的名称。此外,每一端的定义还指示了它是通道的发送端还是接收端以及要使用的通信协议。

每个消息通道都需要一个传输队列,但是该队列实际上位于通道的发送端。因此,只有发送端的消息通道定义包含传输队列的名称。一种常用的实践是将传输队列名称命名为与目标队列管理器相同。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

WebSphere MQ 管理界面

您可以通过本部分描述的各种界面来管理 WebSphere MQ。

MQSC 提供了用于对队列管理器执行配置命令的脚本界面。有两种输入 MQSC 命令的模式:

  • 交互式,通过在键盘上输入 MQSC 命令并等待结果。
  • 创建一个包含 MQSC 命令序列的文件,并提交该文件以便执行。

WebSphere MQ Script (MQSC) Command Reference 对 WebSphere MQSC 作了文档说明,您可以在 WebSphere MQ 文档库(请参见参考资料)中找到它。

应用程序可以构造包含 PCF 命令的消息,并将其放在队列管理器的命令 队列上。队列管理器的命令服务器 检索该消息,执行消息中的 PCF 命令,并将应答放在指定的应答队列上。命名队列和命令服务器在队列管理器网络中的存在,使得每个队列管理器可以仅从网络中的单个系统进行管理,从而提供了单点控制

PCF 命令具有高度结构化的格式,并包含二进制和字符信息。该结构化的格式使得应用程序动态生成 PCF 命令组件变得更加容易。PCF 命令的应答具有类似的格式,使得应用程序进行分析更加容易。

WebSphere MQ Programmable Command Formats and Administration Interface 手册对 PCF 命令做了文档说明,该手册可在 WebSphere MQ 文档库(请参见参考资料)中找到。

控制命令可以在操作系统的命令提示符下输入,也可以将它们包括在操作系统命令文件中,例如 UNIX 系统上的 Shell 脚本。

WebSphere MQ 文档库中的 WebSphere MQ System Administration Guide 对控制命令进行了描述(请参见参考资料)。

WebSphere MQ CL 命令仅在 WebSphere MQ for iSeries 上受支持,并且可在能够输入 OS/400 CL 命令的任何位置输入。

WebSphere MQ 文档库中的 WebSphere MQ for iSeries V6.0 System Administration Guide 对 WebSphere MQ CL 命令做了文档说明(请参见参考资料)。

当队列管理器在其操作期间检测到某个检测事件时,它会在事件队列上放置一个事件消息。事件消息包含有关已发生的事件的信息。

事件消息的格式类似于 PCF 命令,因此旨在由应用程序进行处理。事件队列可通过系统管理应用程序来监视,后者获得放在该队列上的每个消息并采取适当的操作。例如,通过在队列管理器的命令队列上放置一条包含 PCF 命令的消息。

WebSphere MQ 提供了一个用于 Windows 和 Linux 平台上的管理任务的图形用户界面 (GUI),名为 WebSphere MQ Explorer。该应用程序构建在 Eclipse 平台基础上,并作为控制命令或 MQSC 命令的替代方案来提供。WebSphere MQ System Administration Guide 提供了有关使用 WebSphere MQ Explorer 的详细信息(请参见参考资料)。





回页首


在特定平台上安装 WebSphere MQ 就像在同样的平台上安装任何其他软件一样。请始终按照针对该平台的 Quick Beginnings Guide 或针对 z/OS 的 System Setup Guide 中的说明进行操作。

要特别注意有关安装前操作的说明。有些系统要求创建某个用户 ID 和用户组。还要注意有关使用 WebSphere MQ前的操作的说明。有些系统要求更改某些系统参数以支持 WebSphere MQ。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

配置队列管理器

一旦安装了 WebSphere MQ,则创建、配置和控制队列管理器。

用于创建队列管理器的控制命令为 crtmqm。队列管理器名称是必需参数。表 1 描述了 crtmqm 命令的一些可选参数。



-q 指定该队列管理器将成为缺省队列管理器。
-lc 将使用循环日志记录。这是缺省日志记录方法。
-ll 将使用线性日志记录。从介质故障中恢复将需要线性日志记录。
-lf LogFileSize 每个日志文件的大小以 4KB 的倍数表示。
-ld LogPath 用于包含日志文件的目录。

执行 crtmqm 命令时会为该队列管理器创建所有系统和缺省对象。

用于删除队列管理器的控制命令为:

dltmqm QMgrName
                    

其中 QMgrName 是要删除的队列管理器的名称。

您必需拥有正确的权限才能创建或删除队列管理器。





回页首


必须首先启动队列管理器,应用程序才能与它连接,然后才能向它发出任何命令。要启动队列管理器,可使用以下控制命令:

strmqm QMgrName
                





回页首


在详细研究 MQSC 命令之前,您应该知道一些编写 MQSC 命令的重要语法规则:

  • 每个命令在一个新行上开始。
  • 命令的名称及其关键字不区分大小写。
  • 空白行和以星号 (*) 开头的行将被忽略。
  • 如果某行上的最后一个非空白字符为:
    • 减号 (-),则该命令从下一行的开头继续。
    • 加号 (+),则该命令从下一行中的第一个非空白字符开始继续。
  • MQSC 命令可以包含字符串。使用字符串的规则为:
    • 包含空白、小写字符或非 WebSphere MQ 对象名称中的有效字符的字符串必须包括在单引号中。未包括在单引号中的小写字符被转换为大写字符。
    • 未包含字符的字符串无效。





回页首


用于输入 MQSC 命令的管理界面是控制命令 runmqscrunmqsc 的输入为零个、一个或多个 MQSC 命令,输出为执行那些命令的结果,包括操作符和错误消息。

runmqsc标准输入设备(也称为 stdin)读取输入,并将输出写到标准输出设备(也称为 stdout)。通常,标准输入设备是键盘,标准输出设备是显示器。然而,通过使用重定向操作符,可以从文件读取输入并将输出写到文件。

这样,您可以在键盘交互式地输入 MQSC 命令并在显示器上看到结果。或者,您也可以创建一个包含 MQSC 命令序列的文件,然后执行它们并将结果写到某个文件。您甚至可以混合使用这两种方法。

维护 MQSC 命令文件是非常有用的:

  • 用于在多个系统上复制队列管理器配置
  • 用于恢复队列管理器配置
  • 当在测试队列管理器配置的过程中需要进行多次迭代时





回页首


用于定义本地队列的 MQSC 命令是 DEFINE QLOCAL。您还可以使用同义词 DEF QL。让我们看一个示例:

DEFINE QLOCAL(MY_QUEUE) + 
DESCR("This is a test queue")
REPLACE + 
PUT(ENABLED) + 
GET(ENABLED) + 
MAXDEPTH(1000)

此命令定义一个名为 MY_QUEUE 的本地队列,其描述为“This is a test queue”,同时对 PUTting 和 GETting 消息启用,并且最多可以包含 1000 个消息。没有在队列定义中显式定义的任何属性的值都从缺省本地队列 SYSTEM.DEFAULT.LOCAL.QUEUE 的对应属性取得值。

REPLACE 关键字指示,如果该队列已经存在,则将现有队列的定义替换为这个新定义。该队列上的任何消息将保留。让我们看另一个示例:

DEF QL(ANOTHER_QUEUE) LIKE(MY_QUEUE)
            

此命令使用同义词来定义一个本地队列。LIKE 关键字指示队列的缺省属性应该来自 MY_QUEUE 而不是来自缺省本地队列。





回页首


用于显示队列属性的 MQSC 命令是 DISPLAY QUEUE。对应的同义词为 DIS QDISPLAY QUEUE 适用于所有队列类型:本地、别名、远程和模型。

以下命令:

DISPLAY QUEUE(MY_QUEUE)

显示 MY_QUEUE 的所有属性。使用 ALL 关键字来显示所有属性。

若要仅显示您希望显示的那些属性,可使用以下命令:

DIS Q(ANOTHER_QUEUE) DESCR MAXDEPTH

DESCRMAXDEPTH 显示 ANOTHER_QUEUE 的属性。

结尾的星号 (*) 可用作通配符字符。例如,以下命令:

DIS Q(SYSTEM*)

显示以 SYSTEM 开头的所有队列的属性。单独的星号指定所有队列。

用于显示队列管理器属性的 MQSC 命令为 DISPLAY QMGR。其同义词为 DIS QMGR





回页首


别名 队列是用于间接引用另一个队列的 WebSphere MQ 对象。用于创建别名队列的 MQSC 命令是 DEFINE QALIAS。其同义词为 DEF QA。该命令有一个 TARGQ 关键字,用于指示该别名队列所解析到的队列名称。

以下命令:

DEFINE QALIAS(ALIAS_QUEUE) TARGQ(MY_QUEUE)

定义一个名为 ALIAS_QUEUE 的别名队列,它解析为名为 MY_QUEUE 的队列。

远程队列的本地定义 或远程队列是这样一种 WebSphere MQ 对象,它由一个队列管理器拥有,并引用由另一个队列管理器拥有的队列。用于创建远程队列的本地定义的 MQSC 命令为 DEFINE QREMOTE。其同义词为 DEF QR。该命令有一个关键字 RNAME,用于指定远程队列管理器上的队列名称。另一个关键字 RQMNAME 指定远程队列管理器的名称。

以下命令:

\

DEFINE QREMOTE(REMOTE_QUEUE) RNAME(A_QUEUE) RQMNAME(QM2)

定义一个名为 REMOTE_QUEUE 的远程队列,该队列引用名为 QM2 的队列管理器上的名为 A_QUEUE 的队列。

模型 队列是这样一种 WebSphere MQ 对象,其属性被用作创建动态 队列的模板。当应用程序打开模型队列时,队列管理器创建一个动态队列。用于创建模型队列的 MQSC 命令为 DEFINE QMODEL。其同义词为 DEF QM。该命令有一个关键字 DEFTYPE,用于指定从该模型队列创建的动态队列:

  • 临时 动态队列——在关闭时删除,并且在队列管理器重新启动后不复存在 (TEMPDYN),或者
  • 永久 动态队列——其关闭时的删除是可选的,并且在队列管理器重新启动后仍然存在 (PERMDYN)。

以下命令:

DEFINE QMODEL(MY_MODEL_QUEUE) DEFTYPE(TEMPDYN)

创建一个名为 MY_MODEL_QUEUE 的模型队列,它在由应用程序打开时创建一个临时动态队列。





回页首


若要更改队列的属性,可以使用某种形式的 ALTER 命令:

  • ALTER QALIAS(同义词为 ALT QA)修改别名队列的属性
  • ALTER QLOCAL(同义词为 ALT QL)修改本地队列的属性
  • ALTER QMODEL(同义词为 ALT QM)修改模型队列的属性
  • ALTER QREMOTE(同义词为 ALT QR)修改远程队列的属性

若要更改队列管理器的属性,可以使用 ALTER QMGR 命令。其同义词为 ALT QMGR

只有在 ALTER 命令中指定要更改的属性才会被修改;所有其他属性保留不变。

若要删除队列,可以使用某种形式的 DELETE 命令:

  • DELETE QALIAS(同义词为 DELETE QA)删除别名队列
  • DELETE QLOCAL(同义词为 DELETE QL)删除本地队列
  • DELETE QMODEL(同义词为 DELETE QM)删除模型队列
  • DELETE QREMOTE(同义词为 DELETE QR)删除远程队列

仍在使用(由某个应用程序打开)的队列无法删除。

若要从某个未使用的本地队列清除所有消息,可以使用 CLEAR LOCAL 命令。其同义词为 CLEAR QL

以下命令:

CLEAR LOCAL(MY_QUEUE)

从队列 MY_QUEUE 清除所有消息,前提是该队列未使用。





回页首


WebSphere MQ 附带了许多用 C 语言编写的示例程序来完成各种简单任务。这些程序对于测试 WebSphere MQ 安装的配置相当有用。

最常使用的示例程序包括:

amqsput 从标准输入设备读取文本行,将它们转换为消息,并将消息放在指定的队列上。
amqsget 从指定的队列获得消息,并将每条消息中的文本写到标准输出设备。
amgsbcg 浏览指定队列上的消息,并同时以十六进制和字符格式将其内容写到标准输出设备。它还以可读格式显示每条消息的消息描述。

该示例程序接受一个队列名称作为其第一个必需参数,随后是指定队列管理器的第二个可选参数。





回页首


用于结束队列管理器操作的控制命令是 endmqm。该命令通常接受两个参数:第一个参数指示关闭模式,第二个参数指示要停止的队列管理器。

关闭模式包括:

受控(或停止) -c
只有在所有应用程序都已断开连接之后,队列管理器才停止。所有连接到该队列的新请求都会失败。这是缺省模式。
立即 -i
队列管理器在完成当前正在处理的所有 MQI 调用后停止。输入此命令后发出的任何 MQI 调用都将失败。任何未完成的工作单元将在队列管理器下一次启动时回滚。
带等待的受控 -w
停止队列管理器的方式与受控选项相同,但是命令提示符要在队列管理器结束之后才返回。
抢先 -p
队列管理器停止而不等待应用程序断开连接或等待 MQI 调用完成。使用此模式可能导致不可预料的结果。

停止队列管理器的通常模式是受控(或停止)模式。在此模式下,应用程序可以继续完成工作,但是行为良好 的应用程序会在方便的时候尽快断开连接。为了检测队列管理器是否正在停止,行为良好的应用程序应该在 MQOPEN、MQPUT、MQPUT1 和 MQGET 调用上使用 fail if quiescing 选项。使用此选项意味着,如果队列管理器正在停止,则该调用失败。

一旦应用程序检测到队列管理器正在停止,它应该干净地终止。通过这样做,也许可以发出忽略停止状态的进一步调用。在终止前,它可能完成并提交一个正在进行的工作单元,也可能撤销该工作单元。

仅当您需要在具有可预测结果的情况下快速停止队列管理器时,才应该使用停止队列管理器的直接模式。

抢先模式只应用作最后的手段。





回页首


如果您要在自己的系统上执行这些示例,请安装 WebSphere MQ(请参见参考资料以获得指向 WebSphere MQ 试用版的链接),但是不要使用缺省安装目录。相反,应执行自定义安装并将安装目录更改为 C:\WSMQ\。如果您安装到 C:\WSMQ\ 以外的目录,请将本教程说明中的 C:\WSMQ\ 替换为您的安装目录。而且,一旦安装完成并得到提示时,请不要设置缺省配置。

如果您在其他平台上使用 WebSphere MQ,请参考特定平台的文档以了解与这里给出的命令相对应的命令。

我们将创建一个默认队列管理器并启动其操作。

  1. 从 Windows“开始”菜单打开一个命令提示符窗口。
  2. 输入 crtmqm -q QMC1(队列管理器名称是区分大小写的)并按 Enter
  3. 输入 strmqm(由于是缺省队列管理器,这里不需要提供队列管理器名称)并按 Enter。您的屏幕显示应该与图 1 类似。



  4. 输入 cls 并按 Enter,以清除屏幕。
  5. 输入
    runmqsc QMC1 < \WSMQ\tools\mqsc\samples\amqscos0.tst
    

    并按 Enter。此命令创建示例 WebSphere MQ 对象。
  6. 确保全部十二个命令都已成功完成,如图 2 所示。





  7. 输入 cls 并按 Enter,以清除屏幕。

现在我们可以使用 MQSC 命令来显示、创建和修改 WebSphere MQ 对象。

  1. 输入 runmqsc 并按 Enter。这将进入交互式模式。
  2. 输入 display qmgr 并按 Enter,以显示该队列管理器的所有属性。您的屏幕显示应该与图 3 类似。



  3. 输入 display q(SYSTEM*) 并按 Enter。此命令显示所有以“SYSTEM”开头的队列。请参照图 4 检查您的屏幕显示。





  4. 输入 define ql(QL.A) descr('QL.A Text') 并按 Enter。此命令创建一个名为 QL.A 并带有文本描述的本地队列。
  5. 输入 display ql(QL.A) 并按 Enter,以显示该队列的所有属性。请将您的屏幕显示与图 5 进行比较。





  6. 输入 alter ql(QL.A) maxdepth(1000) 并按 Enter,以将该队列上允许的最大消息数量更改为 1000。
  7. 输入 display ql(QL.A) 并按 Enter,以再次显示队列属性,以确保修改是成功的。请注意,没有其他属性被更改,如图 6 所示。





  8. 输入 define ql(QL.B) descr('QL.B Text') 并按 Enter,以定义带有文本描述的第二个队列。
  9. 输入 display ql(QL.B) 并按 Enter,以显示这第二个队列的属性。
  10. 输入 define ql(QL.B) replace maxdepth(2000) 并按 Enter,以将该队列上允许的最大消息数量更改为 2000。
  11. 输入 display ql(QL.B) 并按 Enter,以再次显示属性。请注意,通过替换旧的定义,DESCR 属性被更改为其缺省值(空字符串),如图 7 所示。





  12. 输入 delete ql(QL.A) 并按 Enter,以删除 QL.A 队列。
  13. 输入 delete ql(QL.B) 并按 Enter,以删除 QL.B 队列。
  14. 输入 end 并按 Enter,以退出 runmqsc 交互式模式。
  15. 输入 cls 并按 Enter,以清除屏幕。

现在您将使用在上面的交互式模式下输入的相同命令来创建一个命令文件。然后您可以运行该命令文件并在输出文件中查看结果。

  1. 使用文本编辑器来创建一个文件,其中包含上面输入的命令列表。将该文件命名为 e1_st03.txt。我使用记事本,我的文件与图 8 类似。





  2. 返回到命令提示符,输入 runmqsc < e1_st03.txt > report.txt 并按 Enter
  3. 在文本编辑器中打开 report.txt。滚动到底部以确保所有命令都已成功执行,如图 9 所示。





  4. 在命令提示符下,输入 cls 并按 Enter,以清除屏幕。

定义队列后,您现在可以使用示例程序来放置、浏览和获取消息。

  1. 在命令提示符下,输入 amqsput QL.A 并按 Enter
  2. 输入 Message 1 并按 Enter
  3. 输入 Message 2 并按 Enter
  4. 输入 Message 3 并按 Enter
  5. Enter 退出该程序。
  6. 输入 cls 并按 Enter,以清除屏幕。
  7. 输入 amqsbcg QL.A > out.txt 并按 Enter,以浏览消息并将输出定向到某个文件。
  8. 打开该文件并查看结果。滚动到底部以确保您的文件与图 10 类似。





  9. 在命令提示符下,输入 cls 并按 Enter,以清除屏幕。
  10. 输入 amqsget QL.A 并按 Enter,以从该队列获取消息,从而使该队列变为空队列。您的屏幕显示应该与图 11 类似。





  11. 输入 cls 并按 Enter,以清除屏幕。

下面您将使用别名队列,并了解别名队列与它们所解析到的队列的属性如何相关。

  1. 在命令提示符下,输入 runmqsc 并按 Enter,以启动 MQSC 命令处理器。
  2. 输入 def qa(QA.A) targq(QL.A) 并按 Enter,以创建一个名为 QA.A 的别名队列,此别名队列解析为本地队列 QL.A。
  3. 输入 alter qa(QA.A) put(disabled) 并按 Enter,以在该别名队列上禁止 Put 请求。
  4. 输入 alter ql(QL.B) put(disabled) 并按 Enter,以在本地队列 QL.B 上禁止 Put 请求。
  5. 输入 def qa(QA.B) targq(QL.B) 并按 Enter,以创建一个名为 QA.B 的别名队列,此别名队列解析为本地队列 QL.B。
  6. 输入 end 并按 Enter,以退出 runmqsc。
  7. 输入 cls 并按 Enter,以清除屏幕。
  8. 输入 amqsput QL.A 并按 Enter
  9. 输入 Message 1 并按 Enter
  10. Enter 退出 amqsput。

    请注意,在 QL.A 上放置消息没有任何问题。

  11. 输入 amqsput QA.A 并按 Enter
  12. 输入 Message 2 并按 Enter。同样的程序以原因代码 2051 结束,表明 Put 已在该队列上被禁止。因此,尽管 QA.A 所解析到的队列 (QL.A) 能够接收消息,但是 QA.A 的属性阻止通过该别名队列将消息发送到 QL.A。您可以在 WebSphere MQ 文档库中的 WebSphere MQ Messages 手册中找到原因代码列表(请参见参考资料)。
  13. 输入 amqsput QA.B 并按 Enter
  14. 输入 Message 3 并按 Enter。同样地,同一个程序以原因代码 2051 结束。尽管 QA.B 并未禁止 Put,但是它所解析到的本地队列禁止了 Put,所以不能将消息放置在 QA.B 上。您的屏幕显示应该与图 12 类似。





  15. 输入 runmqsc 并按 Enter,以启动 MQSC 命令处理器。
  16. 输入 clear ql(QL.A) 并按 Enter,以从本地队列 QL.A 清除消息。
  17. 输入 end 并按 Enter,以退出 runmqsc。
  18. 关闭命令提示符窗口。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

发布/订阅

本部分将讨论 WebSphere MQ 包括的发布/订阅功能,并描述如何设置和管理该功能。

WebSphere MQ 发布/订阅功能使应用程序不必知道任何有关目标应用程序的信息。本质上,发送应用程序将信息发送(发布)到由 WebSphere MQ 发布/订阅所管理的标准目标。分发是由发布/订阅来处理的。

接收应用程序也只需向某个标准位置订阅,注册兴趣,然后等待信息交付。

WebSphere MQ 消息是用于在发布者和订阅者之间传输信息的媒介。信息的题目称为主题。发布应用程序在发送消息时指定一个主题。订阅应用程序确定它所感兴趣的主题。只有与订阅者的主题匹配的信息才被发送。

显然,流程需要能够处理信息的正确路由。这是由代理 处理的。

可以将相关主题分组为,从而使得代理需要管理的总项数更少。它还使得访问控制更简单。如果某个主题不属于某个特定的流,则代理具有一个缺省流。

图 13 显示了描述一个新闻服务的简单配置




在本例中,单个流可以构成多种信息:

  • Publisher 1 正在发布有关体育运动结果的数据 (Topic:Sport)
  • Publisher 2 正在发布有关股票价格的数据 (Topic:Stock)
  • Publisher 3 正在发布有关电影评论 (Topic:Films) 和电视 (Topic:TV) 的数据

在图 13 的底部,三个订阅者指示了他们对不同主题的兴趣:

  • Subscriber 1 将获得有关体育运动结果和股票价格的信息
  • Subscriber 2 将获得电影评论信息
  • Subscriber 3 将收到体育运动结果

由于没有人订阅 TV,因此不会分发有关 TV 的信息。

代理配置可以变得非常复杂,一个网络中可以有许多代理。然而,每个队列管理器只允许一个代理。

必须将代理网络排列为层次结构,顶级代理为根代理。它将有一个或多个子代理,并且它本身称为父代理。子代理也可以有子代理,从而形成层次结构。这简化了网络中所需的通道数量。

代理可以交换订阅注册和撤销注册、发布和删除发布的请求以及有关它们自己的信息。代理以本地队列管理器的相同名称命名。

发布者和订阅者可以驻留在 WebSphere MQ 网络中的任何位置,只要存在从它们的队列管理器到代理的路由。

有关 WebSphere MQ 发布/订阅的详细信息,在 WebSphere MQ 文档库中的 WebSphere MQ Publish/Subscribe User's Guide 中可以找到(请参见参考资料)。





回页首


发布/订阅功能所需的队列是在代理启动时自动定义的(如果这些队列还不存在的话)。

流被实现为队列集,支持特定流的每个代理上有一个队列。特定流的每个代理上的队列将具有相同的名称。

所有代理将具有一个缺省流,并使用名为 SYSTEM.BROKER.DEFAULT.STREAM 的队列。此队列接收缺省流的所有发布消息。管理员可以通过设置一系列具有相同名称的本地队列(每个代理一个队列)来创建流。然而,以 SYSTEM.BROKER 开头的流保留以供 WebSphere MQ 使用。

每个代理还有一个控制队列 (SYSTEM.BROKER.CONTROL.QUEUE),其中发送所有命令消息,不过发布和删除发布的请求除外。它是一个预定义队列,并从 SYSTEM.DEFAULT.LOCAL.QUEUE 获得其属性。

SYSTEM.BROKER.ADMIN.STREAM 队列由代理用于发布它自己的配置信息。可以编写能够使用该流上发布的信息的管理应用程序。

如果管理员选择的话,可以在需要的时候动态创建流队列。您需要确保定义一个名为 SYSTEM.BROKER.MODEL.QUEUE 的模型队列。其定义在 WebSphere MQ 附带的脚本 qsfmda.tst 中提供。

通常的 WebSphere MQ 访问控制技术适用于打开发布/订阅消息队列的应用程序和代理。不存在基于主题的安全性;访问检查针对的是流。





回页首


代理的控制是通过一系列特定于代理操作的控制命令来完成的。由于代理运行在队列管理器的上下文中,您在发出这些命令时需要指定与该代理关联的队列管理器,除非它是缺省队列管理器。

代理控制命令包括:

strmqbrk 启动代理。可被触发(请参见触发)。在发出此命令时,如果所有必需的队列不存在,则创建它们。
endmqbrk 停止代理。允许受控或立即关闭。不像队列管理器那样存在抢先式关闭。所有控制信息都被保留,发布者和订阅者注册保持有效。消息只是针对该代理排入队列,直到它重新启动。
dspmqbrk 显示代理状态。返回以下值之一:
  • Starting
  • Running
  • Stopping(立即关闭)
  • Quiescing(受控关闭)
  • Not active
  • Ended abnormally
dltmqbrk 删除代理。若要删除代理,必须停止它,并且队列管理器必须是活动的。在复杂代理结构中,删除某个代理是非常危险的,因为它可能在该层次结构中处于比其他代理更高的位置。如果出现这种情况,则删除失败并产生错误消息。
clrmqbrk 清除相邻目标代理的代理内存。它将取消所有来自目标代理的订阅。这只有在该代理已停止的时候才能进行。此操作需同时在两方进行,以阻止消息流动。
migmqbrk 将代理迁移到 WebSphere MQ Integrator 代理。




回页首


消息代理退出允许在代理上对发布进行自定义;例如,致使不同流的流量跨不同通道发送。

在代理确定它将向特定代理或订阅者发送发布之后将调用退出。退出可以更改消息描述符 (MQMD) 值以及发布信息本身。

必须将退出设置为队列管理器定义的一部分。

有一个参数块用于输入/输出。其中包含与退出调用相关的信息和该调用的结果。在某些限制下(例如,从未使用 QDISC),可以在退出中发出 MQI 调用。

WebSphere MQ 发布/订阅所提供的示例程序之一是路由退出程序。它对于在尝试开发其他退出之前理解其操作可能非常有用。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

触发

当有消息发送到应用程序时,应用程序不必运行——它可以稍后启动。WebSphere MQ 提供了一个功能,允许应用程序在有消息可供检索时自动启动。该功能称为触发

让我们通过研究如图 14 所示的示例并理解其流程来开始讨论触发。




其中的操作顺序为:

  1. Application A 在启用了触发的应用程序队列上放置一条消息。
  2. 如果满足触发条件,则发生触发事件,队列管理器检查该应用程序队列所引用的流程对象。流程对象确定要启动的应用程序,在此例中为 Application B。
  3. 队列管理器创建一个触发器消息,其字段包含从该流程对象的某些属性复制的信息和该应用程序队列。队列管理器将触发器消息放在一个启动队列 上。
  4. 一个称为触发器监视器 的长期运行程序获得触发器消息,检查其内容,然后……
  5. ... 启动 Application B,并将整个触发器消息作为参数来传递。
  6. Application B 打开应用程序队列并从中获得消息。

触发器监视器可以在它自己的执行单元中同步启动该应用程序,或者作为一个单独执行单元来异步启动它。触发器监视器由 WebSphere MQ 提供,但用户也可以编写他们自己的触发器监视器。





回页首


要定义用于触发的应用程序队列,DEFINE QLOCAL 命令必须包含以下参数:

TRIGGER
启用触发。
PROCESS(string)
流程对象名称,用于确定可提供应用程序队列的应用程序。
INITQ(string)
发起队列的名称。

还可以指定控制触发的其他参数。分别是:

TRIGMPRI(integer)
触发器的阈值消息优先级。在决定某个触发器事件是否应该发生时,队列管理器忽略其优先级低于此阈值的消息。
TRIGTYPE(triggertype)
  • 当队列从空队列变为包含一个消息时,触发器类型 FIRST 导致触发器事件发生。
  • 当队列上的消息数量达到 TRIGDPTH 参数所指示的值时,触发器类型 DEPTH 导致触发器事件发生。

    当由 depth 触发时,队列管理器通过在创建触发器消息后将应用程序队列设置为 NOTRIGGER 来禁用触发。通过使用 MQSET 调用来重新启用触发是应用程序的职责。

  • 触发器类型 NONE 指示不发生任何触发器事件。
  • 触发器类型 EVERY 导致为队列上放置的每条消息发生一个触发器事件。
TRIGDPTH(integer)
TRIGTYPE(DEPTH) 引发触发器事件前队列上必须有的消息数量。
TRIGDATA(string)
复制到触发器消息中的数据。





回页首


流程对象使用 MQSC 命令 DEFINE PROCESS 来定义。其同义词为 DEF PRO。它有一个关键字 APPLICID,用于指定要启动的应用程序。

以下命令:

DEFINE PROCESS(MY_PROCESS) APPLICID('C:\MyApp\myprogram.exe')

定义一个名为 MY_PROCESS 的流程,此流程指向 APPLICID 中指定的程序。





回页首


必须满足以下列出的所有条件才会发生触发器事件:

  • 在队列上放置一条消息。
  • 消息优先级不低于队列的 TRIGMPRI 属性中指定的值。
  • 先前队列上的消息数量对该触发器类型来说是正确的。
  • 队列尚未打开以接受输入(仅针对 TRIGTYPE(FIRST)TRIGTYPE(DEPTH))。
  • 队列启用了 Get 请求。
  • 存在一个流程对象。
  • 启动队列存在并且启用了 Put 和 Get 请求。
  • 触发器监视器已将启动队列打开以接受输入。
  • 队列被定义为 TRIGGER
  • 队列未被定义为 TRIGTYPE(NONE)





回页首


WebSphere MQ 提供了几个触发器监视器。触发器监视器 runmqtrm 由大多数 WebSphere MQ 队列管理器使用。不带参数执行的 runmqtrm 控制命令对缺省队列管理器启动触发器监视器,并使用缺省启动队列 (SYSTEM.DEFAULT.INITIATION.QUEUE)。它还提供了用于指定队列管理器和启动队列的参数。





回页首


产生与触发器监视器操作相关的消息的原因有两个:

  • 报告正常活动,例如在触发器监视器启动和结束的时候。这些消息通常不需要任何用户操作。
  • 报告异常条件,例如在触发器监视器未能打开启动队列或在它未能启动指定应用程序的时候。这些消息通常指示需要用户操作来纠正相关条件。

触发器监视器消息可写到标准输出设备,或写到具有更多信息的错误日志。





回页首


在本部分中,您将设置并测试一个简单触发应用程序。您还将使用一个请求-应答场景,并了解如何使用应答队列。您将用于实现触发的两个示例应用程序为 amqsreq 和 amqsech。

amqsreq 示例程序从命令提示符进行调用,完全与 amqsput 一样,只不过要接受第三个输入参数。该程序从标准输入设备读取文本行,将它们转换为请求消息,并将消息放在指定的队列上。每条请求消息都需要一个应答队列名称,这是作为第三个输入参数来指定的。如果省略它,则该名称缺省为 SYSTEM.SAMPLE.REPLY。如果该名称解析为某个模型队列,则会创建一个动态队列。当文本输入终止(空行或 EOF)时,该程序等待应答消息,并将每条应答消息中的文本写到标准输出设备。

amqsech 示例程序旨在由触发器监视器启动,而不是从命令提示符启动。该程序连接到由触发器监视器传递给它的队列管理器,并打开也是由触发器监视器传递给它的队列。该队列被认为是请求队列。该程序从请求队列获得一条消息,创建一条新消息,其中包含与原始消息相同的应用程序数据,并将新消息放在原始消息的消息描述符中指定的应答队列上。然后该程序按顺序获得请求队列上的其余每条消息,并以相同方式生成应答。当请求队列为空时,该程序关闭队列并断开与队列管理器的连接。

首先您需要创建触发所需的 WebSphere MQ 对象。

  1. 使用文本编辑器创建一个名为 e2_st01.txt 的 MQSC 文件,如图 15 所示。





    此文件中有四个命令。第一个命令定义要用作启动队列的队列;第二个命令定义一个启用了触发的本地队列;第三个命令定义流程对象;第四个命令定义要用作应答队列的模型队列。

  2. 打开一个命令提示符窗口,输入 runmqsc < e2_st01.txt 并按 Enter。您的结果应该与图 16 类似。





  3. 输入 cls 并按 Enter,以清除屏幕。
  4. 打开第二个命令提示符窗口。
  5. 在此窗口中,输入 runmqtrm -q QL.INITQ_AP 并按 Enter,以启动触发器监视器。

现在您可以开始测试触发了。

  1. 在第一个命令提示符窗口(不是运行触发器监视器的窗口)中,输入 amqsreq QL.A QMC1 QM.A_REPLY 并按 Enter
  2. 输入 Message 1 并按 Enter。您应该看到另一个命令提示符窗口中的触发器监视器启动 amqsech 并回显您输入的消息,如图 17 所示。



  3. 同时关闭两个命令提示符窗口。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

问题确定

在本部分中,我们将讨论用于确定问题原因的 WebSphere MQ 帮助资源。IBM 红皮书 WebSphere MQ V6 Fundamentals(请参见参考资料)包含一个有关故障排除的很好章节提供了比本教程更多的详细信息。

如果您收到关于队列管理器不可用的错误消息,原因可能很简单,例如队列管理器尚未启动,或者没有指定应用程序,或者队列管理器名称不正确。如果原因不是很明显,请检查以下事项:

  • 相应的配置文件存在。请参见 WebSphere MQ System Administration Guide(在参考资料中)以了解这些文件在您的平台上的位置。
  • 确保已向配置文件分配了适当的权限。
  • 确保 WebSphere MQ 配置文件引用了队列管理器,并具有用于定位与之关联的文件的正确信息。





回页首


错误消息确定普通错误,通常是由用户导致的,例如在控制命令上使用无效参数。通过使用消息目录,这些消息支持国家语言。这些消息写到关联的终端(如有的话),同时写到具有其他信息的错误日志文件。

错误消息只写到名为 AMQERR01.LOG 的错误日志文件。三个目录中的每个目录分别有一个具有该名称的单独错误日志文件。这些目录中的哪个目录用于特定错误消息将取决于出错时对 WebSphere MQ 可用的信息。这些目录分类为:

  • 队列管理器名称已知并且队列管理器可用情况下的错误。
  • 队列管理器名称未知或队列管理器不可用情况下的错误。
  • 所有其他错误。

当错误日志文件 AMQERR01.LOG 装满(其缺省容量为 256KB)时,其内容被复制到 AMQERR02.LOG,然后 AMQERR01.LOG 被重用。在复制之前,AMQERR02.LOG 被复制到 AMQERR03.LOG。先前的 AMQERR03.LOG 内容(如有的话)被丢弃。这样,AMQERR02.LOG 和 AMQERR03.LOG 就用于维护错误消息的历史记录。





回页首


如果 WebSphere MQ 队列管理器检测到意外事件,例如内部队列管理器故障,则在首次故障支持技术(First-failure Support Technology,FFST)报告中提供相关信息。这些报告中的信息与 WebSphere MQ 内部操作相关,因而可能对诊断 WebSphere MQ 问题的 IBM 代表非常有用。

虽然并非所有 FFST 报告都代表 WebSphere MQ 中的故障,但是由于它们代表意外事件,您应该不时地检查它们,并保持生成所有 FFST 报告。WebSphere MQ System Administration Guide 描述了针对您的平台的 FFST 报告名称和位置。





回页首


WebSphere MQ 提供了可以启动和停止的跟踪功能。使用了跟踪时,大量有关 WebSphere MQ 操作的信息被捕获到各种各样的文件中。为了使这些文件大小保持合理,您可以按时间限制跟踪功能,或限制到某个特定的 WebSphere MQ 组件。您还可以将跟踪限制到 MQI,以便诊断应用程序问题。WebSphere MQ System Administration Guide 描述了如何针对您的平台执行跟踪。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

恢复

本部分描述 WebSphere MQ 中的日志记录,以及如何在发生故障时恢复消息和 WebSphere MQ 对象。

WebSphere MQ 中的消息要么是持久的,要么是非持久的

持久消息从不会由于系统故障或由于正在从一个队列管理器传输到另一个队列管理器时发生通信故障而丢失。为实现此目的,持久消息被写出到日志中。当队列管理器在系统故障后重新启动时,它根据需要从所记录的数据中恢复持久消息。

由于日志记录不用于非持久消息,因此消息在队列管理器重新启动后是否存活并不重要时,可以使用非持久消息来实现更好的性能。

持久和非持久消息可以存储在同一队列上。唯一的例外是该队列是临时动态队列,这种队列只能存储非持久消息。





回页首


WebSphere MQ 提供两种日志记录类型:循环线性。日志记录类型是在创建队列管理器时选择的;日志文件的大小和位置也可以在此时指定。

循环日志记录
在不需要介质恢复时使用。循环日志记录中的日志文件被视为一个封闭的环;当日志文件未包含活动日志记录时,就可以重用。活动日志记录是重新启动队列管理器时仍然需要的日志记录。循环日志记录的优点之一在于,日志所需的磁盘空间不随时间而增加。
线性日志记录
支持介质恢复所必需的。日志文件被视为一个序列。线性日志记录中使用的日志文件从不删除,但它在未包含活动日志记录时变为非活动的。新的日志文件在需要时添加到该序列,因此没有空间重用。可以对非活动的日志文件存档以释放磁盘空间,但是不存在支持这样做的自动机制。

队列管理器定期执行日志检查点,从而为队列管理器数据提供一个一致性点。检查点在日志中记录为一系列检查点记录。检查点通过最小化所需的日志重放 (log replay) 来减少重新启动时间。





回页首


当队列管理器在系统故障后重新启动时,它自动恢复任何持久消息。它还恢复任何阻止它启动的受损 WebSphere MQ 对象,但是这通常不包括受损的本地队列。此类队列可以在以后尝试访问它时检测到。

为了重新启动,队列管理器只需要以下内容:

  • 自从上个检查点以来写入的日志记录。
  • 由队列管理器停止时仍在活动的事务写入的日志记录。在这些事务中放入或获得的未提交持久消息在重新启动期间回滚。





回页首


正如上面所提到的,队列管理器通常不在重新启动期间检测受损的本地队列。仅当它在存储未提交的持久消息时才会检测受损的本地队列,这些未提交的持久消息是在队列管理器关闭时仍然活动的事务中放入或获得的。在此情况下,队列管理器自动重新创建该本地队列,因为它需要能够回滚未完成的事务。

更通常的情况是仅在尝试对其进行访问时才检测受损的本地队列。当这种情况发生时,可以使用 rcrmqobj 控制命令从线性日志重新创建该本地队列。您应该定期记录本地队列的介质映像(使用 rcdmqimg 控制命令),这样在必须重新创建它时就不会花太长的时间。

虽然除了本地队列以外,您还可以对其他类型的 WebSphere MQ 对象使用刚才讨论的控制命令,但是重新创建其他类型的对象的最简单方法是重新运行最初用于创建它们的 WebSphere MQ 命令。这适用于别名队列、模型队列、远程队列的本地定义、流程对象和通道。





回页首


可以使用 dmpmqlog 控制命令来转储日志的格式化版本。只有在队列管理器没有运行时才能使用此命令。

缺省情况下,转储从日志的头部 开始。日志的头部是开始日志活动部分的检查点。通常,这是最近的检查点。然而,如果队列管理器停止时有仍在活动的事务,并且有在最近检查点之前的这些事务中放入或获得的未提交持久消息,则日志头部可能位于某个更早的检查点。

由于队列管理器在正常关闭期间创建一个检查点,这种情况下的日志活动部分仅包含少量日志记录。不过,dmpmqlog 控制命令上有一些选项允许您指定不同的转储起点。转储可以从以下位置开始:

  • 在日志的基部。日志的基部是包含日志头部的日志文件中的第一个日志记录。
  • 在通过指定的日志序列号 (LSN) 标识的单个日志记录处。每个日志记录都由唯一的 LSN 来标识。
  • 指定的范围编号。所有日志文件都具有 Snnnnnnn.LOG 形式的文件名,其中 nnnnnnn 就是范围编号。此选项仅对线性日志记录可用。

在日志中格式化的信息包括持久消息的放入和获得、事务事件以及 WebSphere MQ 对象的创建、修改和删除。





回页首


现在看一下持久消息如何在队列管理器从启动之后存活下来。

  1. 创建一个 MQSC 命令文件,其中定义两个本地队列 QL.A 和 QL.B,并具有缺省持久性 YES。

    另外创建两个别名队列 QA.A 和 QA.B,分别解析为这两个本地队列,但是将缺省持久性设置为 NO。

    最后,从本地队列清除消息。将该文件命名为 file e3_st01.txt。它应该与图 18 类似。



  2. 打开一个命令提示符窗口,输入 runmqsc < e3_st01.txt 并按 Enter。确保所有命令成功执行。
  3. 输入 amqsput QL.A 并按 Enter
  4. 输入 Persistent message 1 并按 Enter,以在本地队列 QL.A 上放置一条持久消息。
  5. Enter 退出 amqsput。
  6. 输入 amqsput QL.B 并按 Enter
  7. 输入 Persistent message 2 并按 Enter,以在本地队列 QL.B 上放置一条持久消息。
  8. Enter 退出 amqsput。
  9. 输入 amqsput QA.A 并按 Enter
  10. 输入 Nonpersistent message 1 并按 Enter,以在本地队列 QL.A 上放置一条持久消息(由于显式打开的队列 (QA.A) 的缺省持久性设置为 NO,所以该消息是非持久的)。
  11. Enter 退出 amqsput。
  12. 输入 amqsput QA.B 并按 Enter
  13. 输入 Nonpersistent message 2 并按 Enter,以在本地队列 QL.B 上放置一条持久消息。
  14. Enter 退出 amqsput。
  15. 输入 amqsbcg QL.A 并按 Enter,以浏览本地队列 QL.A 上的消息。您应该同时看到持久和非持久消息。
  16. 输入 endmqm -i QMC1 并按 Enter,以停止队列管理器。
  17. 输入 strmqm,以启动队列管理器。
  18. 输入 amqsbcg QL.A 并按 Enter,以浏览本地队列 QL.A 上的消息。您应该仅看到持久消息。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 2 部分:安装和配置

总结

本教程介绍了 WebSphere MQ 的安装和配置,并探索了可能出现的问题的故障排除技术。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

但愿您会发现本教程是有帮助的,并祝您在准备认证考试时获得好运。

阅读(1314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~