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

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575127
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575128
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575129
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575130
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575131
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575132
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575133
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575134
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575135
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575136
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575137
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575138
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575139
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575130
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575141
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575142
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575143
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575144
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575145
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575146
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575147
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575148
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575149
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575150
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575151
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575152
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575153
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575154
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575145
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575156
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575157
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575158
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575159
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575160
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575161
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575162
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575163
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575164
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575165
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575166
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575167
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575168
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575169
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575160
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575171
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575172
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575173
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575174
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575175
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575176
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。
WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分-dahaili-ChinaUnix博客
  • 博客访问: 575177
  • 博文数量: 30
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-28 13:40
文章分类

全部博文(30)

文章存档

2010年(1)

2009年(29)

我的朋友

分类:

2009-05-08 13:26:57

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理
 
 

级别: 中级

Willy Farrell, 高级软件工程师, IBM Developer Skills Program

2007 年 5 月 29 日

准备 IBM 认证考试 996:WebSphere MQ Solution Designer。本教程讨论分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论如何处理异常和安全问题。这是关于 WebSphere MQ Solution Designer 的包括五个教程的系列中的第三个教程。

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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

开始之前

WebSphere® MQ Version 6.0 以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过提供重要消息和事务可靠的“一次且仅一次”的传递,WebSphere MQ 解决了通信协议的复杂性,并在可用资源之间动态分配消息工作负载。这个包括五个教程的系列帮助您准备参加 IBM 认证考试 996:IBM WebSphere MQ V6.0, Solution Design。该认证针对了解异步消息的概念并且能够规划、架构和设计基于 WebSphere MQ 的解决方案的中级设计人员。





本教程是旨在帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design 的系列中的第三个教程。本教程讨论 WebSphere MQ 中的分布式队列管理。完成本教程后,请继续学习第四个教程,其中介绍了主要 MQI 调用。





完成本教程后,您应该熟悉:

  • 配置 WebSphere MQ 以实现分布式队列。
  • WebSphere MQ 客户端。
  • WebSphere MQ 集群。
  • 可伸缩性和性能问题。
  • 应用程序数据转换。
  • 远程管理。
  • 处理异常。
  • WebSphere MQ 的安全特性。
  • WebSphere MQ 系列 SupportPac。





本教程是为具有应用程序和解决方案设计和实现方面的中级经验的开发人员和架构师编写的。它假设您具有以下几个方面的中级知识和技能:

  • 事务管理和数据库产品
  • 系统管理
  • 基本编程概念
  • 数据通信和网络
  • 信息技术安全概念




本教程中的示例是使用 WebSphere MQ V6.0 for Windows® Rational® Application Developer v6.0 for Windows 来开发的。

本教程中使用的产品的系统要求可通过以下链接找到:

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

分布式队列的配置

本部分介绍如何配置 WebSphere MQ,以使一个队列管理器能够与另一个队列管理器交换消息。

通过使用 MQSC 命令 DEFINE QREMOTE 来创建远程队列的本地定义,远程队列的位置可以变得对应用程序透明。此定义包括远程队列管理器上的队列名称和远程队列管理器的名称。

将用于在队列管理器之间传输消息的每个消息通道的发送端还必须定义一个传输队列。传输队列的定义方式与本地队列相同,只不过 DEFINE QLOCAL 命令应该包含参数 USAGE(XMITQ) 以指示其用途。





回页首


消息通道代理(message channel agent,MCA)是一个有助于将消息从一个队列管理器移动到另一个队列管理器的程序。一个 MCA 对协同操作以形成一个消息通道

通道定义提供了控制 MCA 操作方式的参数。每个消息通道都有两个定义——通道的每一端分别有一个定义。两个定义中的通道名称必须相同。

通道的每一端都具有类型,一端的通道定义将指定该端的通道类型。四种可能的类型如下:

  • 发送者
  • 接收者
  • 服务器
  • 请求者

发送者或服务器从传输队列获得消息,并通过网络发送它们。接收者或请求者从网络接收消息,并将它们放在各自的目标队列上。

一端的通道定义必须指定与另一端的定义中指定的类型兼容的类型。本系列的第 1 部分描述了兼容的通道类型组合。





回页首


消息通道是使用 MQSC 命令 DEFINE CHANNEL 来定义的。其同义词为 DEF CHL。此命令的一些参数如下:

参数 定义
(channel-name) 通道名称。命名通道的规则与队列的命名规则相同,只不过通道名字仅限于 20 个字符。
CHLTYPE 通道类型。允许的值为 SDRRCVRSVRRQSTR
TRPTYPE 传输类型。此参数指定通道所使用的通信协议。
CONNAME 连接名称。它对于 SDRRQSTR 通道是必需的,但是对于 SVR 通道是可选的。此参数的值取决于所使用的通信协议。WebSphere MQ Script (MQSC) Command ReferenceWebSphere MQ Intercommunication 手册包含了有关如何使用这些参数的完整详细信息(请参见参考资料)。
XMITQ 传输队列的名称。对于 SDRSVR 通道是必需的。

让我们看一个例子。假设您希望拥有两个队列管理器,一个在 Austin,一个在 Raleigh,并且您需要配置两个队列管理器同时相互发送和接收对方的消息。在 Austin 的队列管理器上,所需的定义与以下内容类似:

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.84.100.1(1414)') +
         XMITQ('Raleigh')

      DEF QL('Raleigh') USAGE(XMITQ)

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      

CONNNAME 参数中,您已给出了 TCP/IP 地址。您还可以给出主机名称,它将在 DNS 下进行解析。请注意括号中的值 1414。这是端口号。1414 是 WebSphere MQ 用于 TCP/IP 通信的缺省端口号,因此实际上不一定要包括它。

在 Raleigh 队列管理器上,您需要与 Austin 队列管理器上的通道定义相匹配的定义,如下所示:

      DEF CHL('Raleigh_Austin') +
         CHLTYPE(SDR) +
         TRPTYPE(TCP) +
         CONNAME('9.20.31.5(1414)') +
         XMITQ('Austin')

      DEF QL('Austin') USAGE(XMITQ)

      DEF CHL('Austin_Raleigh') +
         CHLTYPE(RCVR) +
         TRPTYPE(TCP)
      





回页首


在确定将消息发送到远程队列管理器所要使用的传输队列时,按顺序应用以下规则:

  1. 使用远程队列的本地定义中明确指定的传输队列。
  2. 使用与远程队列管理器名称相同的传输队列。
  3. 使用缺省传输队列

在较大的网络中,缺省传输队列是非常有用的。如果目标队列管理器在本地队列管理器上未知,基本的策略是将消息发送到知道它的队列管理器。

如果该队列管理器无法通过应用上述规则来找到传输队列,则会报告一个错误。





回页首


带空白远程队列名称的 DEFINE QREMOTE 命令用于定义队列管理器别名

通过使用缺省传输队列和队列管理器别名,在较大的网络中可以通过后继队列管理器来传递消息。给定如图 1 所示的队列管理器网络,以下定义将允许把源自队列管理器 QMC 的消息传递到队列管理器 QMF。

  • 在 QMC 上,创建一个名为 QMA 的传输队列,并使之成为缺省传输队列。
  • 在 QMA 上,创建一个名为 QMB 的传输队列,并将 QMF 定义为队列管理器别名,同时将 QMB 指定为要使用的传输队列。
  • 在 QMB 上,创建一个名为 QMF 的传输队列。



 




回页首


还可以使用队列管理器别名来分离两个队列管理器之间的消息流。请考虑如下面的图 2 所示的两个队列管理器。



 

下面研究 QM1 上提供的定义。

            DEF QR(QR.SERV) +
               RNAME(QL.SERV) +
               RQMNAME(QM2) +
               XMITQ(QM2A)

            DEF QR(QR.REPLY/A) +
               RN(QL.REPLY) +
               RQMNAME(QM1A)

            DEF QR(QM1A) +
               RQMNAME(QM1)
            

两个队列管理器之间的正常消息流量通过传输队列 QM1 和 QM2。然而,您已经为 Program X 和 Program Y 之间的通信提供了单独的流。

Program X 将一个请求消息放置在队列 QR.SERV 上。QR.SERV 是一个远程队列的本地定义,它将 QL.SERV 指定为远程队列名称,将 QM2A 指定为要使用的传输队列。因此该消息将在服务于传输队列 QM2A 的通道上发送,而不是在服务于传输队列 QM2 的“正常”通道上发送。

在该消息中,Program X 将应答队列指定为 QR.REPLY/A,后者通过使用应答队列别名来解析为应答队列管理器 QM1A 上的应答队列 QL.REPLY。

Program Y 从 QL.SERV 获取请求消息,这些消息可能来自多个客户端程序。每个请求包括其消息描述符、应答队列名称和应答队列管理器。Program Y 打开将在其上放置应答消息的队列时,在对象描述符中指定这些名称。

在队列管理器 QM2 上,不存在明确标识某个传输队列的远程队列的本地定义。因此,应答消息将放置在其名称与应答队列管理器名称相同的传输队列上,在此例中为 QM1A。从而应答消息在服务于传输队列 QM1A 的通道上发送,而不是在服务于传输队列 QM1 的正常通道上发送。

在队列管理器 QM1 上,也不存在将 QM1A 指定为 QM1 别名的队列管理器别名定义。当目标地址为 QM1A 的应答消息到达 QM1 时,该队列管理器解析队列管理器别名,并将消息放在队列 QL.REPLY 上以便 Program X 获取。





回页首


WebSphere MQ 的 TCP/IP 配置随安装 WebSphere MQ 的平台而异。在 Unix 系统上,inet 守护进程用作消息侦听器,必须将它配置为侦听 WebSphere MQ 缺省端口 1414。在 Windows 上,可以使用控制命令 runmqlsr。有关详细信息,请参见 WebSphere MQ Intercommunication 手册。





回页首


若要启动消息通道,可以使用 MQSC 命令 START CHANNEL,并提供要启动的道通名称。还有一个 PING CHANNEL 命令可用于测试消息通道配置。

除了 MQSC 命令以外,还有一个控制命令 runmqchl 可以启动通道。它接受一个 -c 参数以指定要启动的通道。





回页首


MQSC 命令 START CHANNEL 和控制命令 runmqchl 没有包含用于启动通道的重试逻辑。如果需要重试逻辑,例如在无法启动通道的情况下,尤其是对于在发生错误后重新启动通道,您应该使用通道启动器。用于启动通道启动器的 MQSC 命令为 START CHINIT。对应的控制命令为 runmqchi





回页首


可以使用 MQSC 命令 DISPLAY CHSTATUS 来确定通道的状态。通道可以处于以下任何一种状态:

正在初始化
通道启动器正在尝试启动该通道。
正在启动
如果没有活动的 Slot 可用,则通道在此状态下等待。如果有活动的 Slot 立即可用,则它在此状态保持非常短的时间。活动 Slot 的数量是由队列管理器的 MAXCHL 属性定义的。
正在绑定
正在建立通信连接和执行初始数据交换。
正在请求
请求者正在等待来自发送者的回调。
正在运行
正在传输消息,或等待消息到达传输队列。
已暂停
在尝试将消息放在其目标队列上之前,等待消息重试间隔结束。
正在停止
发生了错误,发出了 STOP CHANNEL 命令,或者断开连接间隔已截止。
正在重试
正在等待,直到通道启动器应该进行下一次启动该通道的尝试。
已停止
通道被禁用,并且需要人工介入才能重新启动它。
不活动
不活动的通道是从未启动或已正常断开的通道。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 客户端

在本部分中,您将更详细地研究 WebSphere MQ 客户端。

WebSphere MQ 客户端可以安装在没有运行队列管理器的系统中。该客户端允许与 WebSphere MQ 客户端运行于同一系统中的应用程序连接到运行于另一个系统中的队列管理器,并向该队列管理器发出 MQI 调用。此类应用程序称为WebSphere MQ 客户端应用程序,该队列管理器称为服务器队列管理器。图 3 显示了这种配置。



 

WebSphere MQ 客户端应用程序和服务器队列管理器使用 MQI 通道 实现彼此之间的通信。MQI 通道在客户端应用程序发出 MQCONN 或 MQCONNX 调用时启动,在客户端应用程序发出 MQDISC 调用时结束。

要使 WebSphere MQ 客户端进行有效地处理,需要快速的和可靠的同步通信连接。

当应用程序作为 WebSphere MQ 客户端运行时,MQI 调用的行为就像对另一个系统上的服务器队列管理器的远程过程调用。为服务于 MQI 调用而执行的大多数代码都驻留在服务器系统上。这可能意味着,如果存在通信失败,则对 MQI 调用的服务可能涉及到某些延迟。所有故障都附带一个原因代码向应用程序进行报告。

MQI 调用的输入参数由客户端连接通过网络发送到运行于服务器系统上的服务器连接。服务器连接充当客户端应用程序的代理,并代表该应用程序向服务器队列管理器发出 MQI 调用。执行调用以后,服务器连接将调用的输出参数通过网络发送给客户端连接,后者将输出参数传递到应用程序上。

虽然全套 MQI 调用和选项都对作为 WebSphere MQ 客户端运行的应用程序可用,但是在某些环境中可能存在与系统资源相关的限制,例如内存约束。





回页首


WebSphere MQ 客户端应用程序可以参与涉及到它所连接到的队列管理器资源的本地工作单元。为此,它以通常方式使用 MQCMIT 和 MQBACK 调用。

然而,标准 WebSphere MQ 客户端应用程序无法参与全局工作单元。此类应用程序可以向另一个资源管理器或同步点协调器发出调用(无论它是在与应用程序相同的系统上还是在另一个系统上),并且可以参与和该资源管理器或同步点协调器关联的工作单元。与此同时,它还可以参与涉及到它所连接到的队列管理器资源的本地工作单元。在此情况下,两个工作单元是彼此独立地完成的。

WebSphere MQ 的确提供了一个扩展事务客户端,它支持连接到远程队列管理器的应用程序包括全局工作单元中的 WebSphere MQ 操作。在这些情况下,WebSphere MQ 无法充当全局工作单元的事务管理器,因为只有队列管理器才能够协调 WebSphere MQ 中的全局工作单元。然而,WebSphere MQ 可以充当全局工作单元中的资源管理器。

虽然标准 WebSphere MQ 客户端是免费提供的,但是扩展事务客户端是在与标准 WebSphere MQ 客户端不同的许可条款和定价下提供的。





回页首


有些 WebSphere MQ 客户端是在用于 WebSphere MQ 服务器安装的分发介质上提供的。其他客户端则作为 SupportPac 来提供。有关您的平台的详细信息,请参见 Quick Beginnings 指南和 WebSphere MQ Clients 手册(请参见参考资料)。

只具有 标准 WebSphere MQ 客户端安装的计算机不需要 WebSphere MQ 服务器许可证。





回页首


与消息通道一样,MQI 通道同时需要通道两端的定义,并且 MQI 通道的每一端都具有某种类型。CLNTCONN 类型用于客户端系统上的 MQI 通道端,SVRCONN 类型用于服务器系统上的 MQI 通道端。

然而要记住,MQI 通道在信息流方面是双向的(MQI 调用的输入参数沿一个方向流动,输出参数沿相反方向流动)。您不需要定义两个通道,即每个方向一个通道。

MQI 通道不需要直接的操作介入。客户端应用程序只需发出 MQCONN 或 MQCONNX 调用来启动它,并由客户端应用程序发出 MQDISC 调用来停止。





回页首


存在两种配置 MQI 通道的方法。第一种方法是在服务器上定义一个服务器连接。然后在客户端系统上设置环境变量 MQSERVER。赋予此变量的值为 ChannelName/TransportType/ConnectionName。例如:

SET MQSERVER=QMC1.SVR/TCP/9.20.4.56

在 Windows 系统上用于使用名为 QMC1.SVR 的 SVRCONN 通道来通过 TCP/IP 连接到位于给定 IP 地址的服务器。

通过这种方法可以定义某个 MQI 通道的多个实例。多个客户端可以具有相同的 MQSERVER 环境变量值,从而使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。

第二种方法是同时在服务器上定义服务器连接和客户端连接。客户端连接存储在服务器系统上的客户端通道定义表 中。此表的文件名为 AMQCLCHL.TAB。此表必须对客户端系统可访问。它可以驻留在文件服务器上,也可以将它复制到客户端系统。

然后在客户端系统上设置环境变量 QCHLLIB 和 MQCHLTAB,以便指定客户端连接定义表的位置和名称。例如:

  
SET MQCHLLIB="C:\Program Files\IBM\WebSphere MQ"
SET MQCHLTAB=AMQCLCHL.TAB

在 Windows 系统上用于指示客户端通道定义表的位置和名称。

可以存在某个 MQI 通道的多个实例。多个客户端可以使用服务器上定义的同一 SVRCONN 通道来发出 MQI 调用。





回页首


存在一种自动定义通道的方法。.只有 RCVR 和 SVRCONN 通道才可以通过这种方式来进行定义。

如果存在要启动某个消息通道或 MQI 通道的传入请求,但是不存在该特定通道的通道定义,则会调用此功能。队列管理器对象的属性 ChannelAutoDef 还必须设置为 MQCHAD_ENABLED。ALTER QMGR 命令的对应参数为 CHAD(ENABLED)。

该定义是使用相关系统对象作为模型来创建的:SYSTEM.AUTO.RECEIVER 用于 RCVR 通道,SYSTEM.AUTO.SVRCONN 用于 SVRCONN 通道。通道名称为传入请求所提供的名称。

一旦以这种方式创建并存储了通道定义,随后就可以像它始终存在一样使用该定义。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ 集群

本部分探索 WebSphere MQ 集群以及如何定义和管理它们。

集群 是队列管理器的集合,这些队列管理器可以在不同的平台上,但是通常为同一个应用程序服务。每个队列管理器都可以将它们承载的队列提供给集群中的其他每个队列管理器。特定于集群的对象消除了每个目标队列管理器对通道定义和传输队列的需要。

集群中的队列管理器通常承担客户端或服务器的角色。服务器将承载对其他集群成员可用的队列,同时还运行处理这些消息并生成响应的应用程序。客户端将消息放在服务器的队列上,并且可以接收返回的响应消息。

集群中的队列管理器通常直接相互通信,尽管许多客户端系统通常从来不需要与其他客户端通信。





回页首


存在多种特定于集群的 WebSphere MQ 对象。

集群存储库
属于集群成员的队列管理器的相关信息集合,包括队列管理器名称、它们的通道、它们承载的队列和其他信息。

存储库中的信息通过一个名为 SYSTEM.CLUSTER.COMMAND.QUEUE 的队列与其他存储库交换,并存储在一个具有固定名称 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的队列上。存储库可以是完整的部分的(后面会更详细地讨论这一点),并且每个集群队列管理器都必须至少有一个到包含完整存储库的另一个队列管理器的连接。

集群发送者通道 (TYPE(CLUSSDR))
通道定义,集群队列管理器可以在该通道上向集群中承载完整存储库的另一个队列管理器发送消息。此通道用于将队列管理器状态的任何更改通知存储库,例如添加或删除某个队列。
集群接收者通道 (TYPE(CLUSRCVR))
通道定义,集群队列管理器可以在该通道上接收来自集群中的消息。通过此对象的定义,将某个队列管理器广告给集群中的其他队列管理器,从而使它们能够为该队列管理器自动定义适当的 CLUSSDR 通道。每个集群队列管理器至少需要一个集群接收者通道。
集群传输队列
用于将来自该队列管理器的所有消息放置到集群中的任何其他队列管理器上。此队列名为 SYSTEM.CLUSTER.TRANSMIT.QUEUE,并且必须在每个集群队列管理器中存在。
集群队列
由某个集群队列管理器承载并对集群中的其他队列管理器可用的队列。该本地队列或者是预先存在的,或者是在本地队列管理器上创建的。为了在集群中发挥作用,本地队列定义指定了集群名称。集群中的其他队列管理器可以看到此队列,并且可以在它上面放置消息,而无需使用远程队列定义。可以将该集群队列向多个集群进行广告。





回页首


正如曾经指出的那样,每个集群队列管理器都必须有一个名为 SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,其中存储所有与集群相关的信息。至少有一个(出于可用性的考虑,通常为两个或更多个)集群队列管理器必须包含完整存储库。这意味着它具有关于集群中每个队列管理器的完整信息集。

存储库队列管理器(有时简称为存储库)必须彼此完全互连并位于网络中,以提供较高级别的可用性。

普通队列管理器建立并维护一个部分 存储库,其中仅包含关于它感兴趣的那些队列管理器和队列的信息。此信息可以在操作期间通过查询完整存储库来进行更新和扩展。





回页首


假设您以前创建了一个名为 QM1 的队列管理器,并且它没有参加某个集群。下面让我们看一下在一个名为 EDUC 的集群中设置该队列管理器所需要的命令和定义。

若要使 QM1 成为集群 EDUC 中的存储库,可以使用以下命令:

ALTER QMGR REPOS(EDUC)

集群中的每个队列管理器都必须有一个集群接收者通道,其定义如下:

DEFINE CHANNEL(TO.QM1) + 
CHLTYPE(CLUSRCVR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

将到该集群(假设它名为 QM4)中的现有完整存储库的连接定义为一个集群发送者通道,如下所示。

DEFINE CHANNEL(TO.QM4) + 
CHLTYPE(CLUSSDR) + 
CONNAME(...) + 
CLUSTER(EDUC)
            

若要定义参加该集群的本地队列(可以从集群中的其他队列管理器访问,而无需远程队列的本地定义),相应的命令为:

DEFINE QLOCAL(QUEUE1) + 
CLUSTER(EDUC)
            

无需指定队列管理器的网络地址即可定义集群接收者通道。当没有定义 CONNAME 而使用 TCP/IP 时,WebSphere MQ 生成 CONNAME,并采用缺省端口和使用系统的当前 IP 地址。当集群中的系统使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)时,此功能非常有用。

无需指定存储库队列管理器名称即可定义集群发送者通道。当用于集群中通道的命名约定包括队列管理器名称时,CLUSSDR 定义可以使用 +QNAME+ 来替换队列管理器名称,WebSphere MQ 将使用正确的队列管理器名称来替换 +QNAME+。





回页首


集群支持允许多个队列管理器承载同一队列的实例。因此,两个或更多队列管理器可以是彼此的克隆,能够运行相同的应用程序并具有相同队列的本地定义。可以配置此功能来增加可用于处理消息的容量,或者引入从一个服务器到另一个服务器进行故障转移工作的能力,从而提高服务可用性。

当用于在两个队列管理器之间分散工作负载时,应用程序必须支持消息的并行处理。

如果存在多个选择,内置的工作负载管理算法将基于可用性和通道优先级来确定远程队列管理器。本地实例始终优先。您可以提供自己的集群工作负载出口来取代内置算法。

MQOPENMQPUT1 调用打开某个集群队列,或者使用 MQPUT 来将消息放置到某个队列上时,将调用集群工作负载出口(内置或用户提供)。

队列属性 DEFBIND 确定是否将在某个队列已打开时执行重新路由。OPEN 值指示目标队列在 MQOPEN 时进行选择,并且在 MQCLOSE 之前不会更改。NOTFIXED 值指示在目标队列管理器不可用时,将在 MQPUT 上调用集群工作负载出口。

您应该确保参加工作负载平衡的所有队列都具有相同的优先级、缺省持久性和 DEFBIND 值。





回页首


以下队列管理器属性特定于参加集群的队列管理器。

REPOS(ClusterName)
指示此队列管理器作为完整存储库参加指定的集群。
REPOSNL(NamelistName)
指示此队列管理器作为完整存储库参加 NameList 中包括的所有集群。
CLWDATA(将传递给工作负载出口的数据)
将传递给工作负载出口的 32 字符数据字符串。
CLWEXIT(用户提供的集群工作负载出口名称)
用于取代内置出口的用户提供的工作负载出口名称。
CLWLLEN(整数)
可传递给工作负载出口的消息数据最大字节数。
CLWLUSEQ(用于集群队列的指示器)
指定在目标队列具有一个本地实例并且至少有一个远程集群实例时的 MQPUT 操作行为。LOCAL 指示该本地实例是 MQPUT 的唯一目标。ANY 指示队列管理器将本地队列视为集群队列的另一个实例,以用于工作负载分配目的。队列具有一个同名称的属性,可用于重写队列管理器的行为。





回页首


以下 MQSC 命令特定于集群环境。

命令 定义
SUSPEND QMGR 临时从集群删除某个队列管理器,意味着工作负载管理出口不会将任何消息路由到该队列管理器。关于挂起的队列管理器及其对象的所有信息保留在存储库中,但是将该队列管理器标记为“挂起”。如果必须卸载某个队列管理器以便维护,则此功能可能非常有用。
RESUME QMGR 恢复挂起的队列管理器。
REFRESH CLUSTER 丢弃本地保存的所有关于集群的信息,从而强制此队列管理器在集群中冷启动。不应用于定期操作。
RESET CLUSTER 只能由存储库队列管理器发出,并迫使指定的队列管理器离开集群,使得集群中的其他所有队列管理器接到关于此队列管理器已不再属于该集群的通知。
DISPLAY CLUSQMGR 返回存储在 SYSTEM.CLUSTER.REPOSITORY.QUEUE 中关于集群中的队列管理器的集群信息。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

可伸缩性和性能

使用基础操作系统和硬件提供的功能,WebSphere MQ 天生就设计为在应用程序之间提供高性能的消息传递。在本部分中,您将研究一些使用 WebSphere MQ 分布式队列功能来增强可伸缩性和性能的典型 WebSphere MQ 体系结构。

最简单的配置由运行在服务器上的单个队列管理器组成。使用队列来提供服务的应用程序与队列管理器驻留在同一系统上,请求服务的应用程序驻留在该系统上或驻留在其他系统上。

此体系结构非常简单,易于设置。所有应用程序、请求者和提供者都与队列管理器驻留在同一系统上。尽管这并不是真正的分布式队列,但是 WebSphere MQ 所提供消息服务的异步性质为提供服务的应用程序赋予了一些工作负载灵活性。此体系结构的性能依赖于基础平台。

向该体系结构添加 WebSphere MQ 客户端可以将请求应用程序转移到单独的系统上,并提高该体系结构的可伸缩性和性能。图 4 描绘了该体系结构。



 




回页首


通过在附加系统上添加队列管理器,可以实现额外的性能和可伸缩性。使用此体系结构,请求应用程序不必与拥有由提供应用程序使用的队列的队列管理器驻留在同一系统上,客户端也不必连接到拥有由提供应用程序使用的队列的队列管理器。然而,请求应用程本身不必更改;它们仍然将消息放在请求服务的队列上,但是现在该服务可能由驻留在另一个系统上的应用程序提供。





回页首


在附加系统上添加额外的队列管理器可能意味着必须在该基础设施中的所有队列管理器之间配置通信通道。从维护的角度看,更多数量的通道可能变得不堪重负,包括在部署附加应用程序时需要定义额外的通道。

此问题可通过部署中心和分支 体系结构来克服。在此配置中,中心系统承载提供服务的应用程序。中心系统还可以承载应用程序所需的其他资源,例如数据库。充当请求应用程序(无论是驻留在与队列管理器相同的系统上,还是驻留在与 WebSphere MQ 客户端相同的系统上)宿主的队列管理器称为中心和分支体系结构的分支。

中心和分支体系结构不仅减少了需要定义的通道数量,而且还提供了配置应用程序和基础设施的灵活性,以提高可伸缩性和性能。图 5 显示了一个中心和分支体系结构。



 




回页首


最灵活的方法是在队列管理器集群中将队列管理器联接在一起。这允许通过多个队列管理器承载相同服务的多个实例。需要服务的应用程序的请求将在承载该服务的所有可用队列管理器之间进行工作负载平衡。图 6 显示了一个队列管理器集群。



 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

数据转换

本部分讨论如何转换在使用不同字符或数字数据表示形式的系统之间传递的消息中的数据。

当通过异类队列管理器网络路由消息时,存在处理不同数据表示形式的要求。有些字符可能需要从一种字符转换为另一种字符。有些数字字段可能需要转换,例如整数的字节反转。

每个消息都附带一个消息描述符,并连同应用程序数据一起传递给接收应用程序。消息描述符始终转换为目标系统的表示形式。当在两个队列管理器之间启动某个消息通道时,两个 MCA 将确定需要什么转换,并决定其中哪个 MCA 执行该转换。

另一方面,消息中的应用程序数据转换需要更多的关注。





回页首


消息描述符中存在三个与应用程序数据转换有关的字段:

字段 功能
Encoding 指定消息中的数字数据表示形式。
CodedCharSetId 指定消息中的字符数据表示形式。
Format 指定消息中的数据性质。




回页首


应用程序可以在 MQGET 调用上请求应用程序数据转换。仅当存储的消息的表示形式与 MQGET 调用上请求的表示形式不同时,才会进行转换。此方法可称为“接收者决定结果”,意味着消息中的应用程序数据只需转换一次,即使消息必须通过多个队列管理器。

您还可以请求消息通道的发送端执行转换。这始终将消息转换为通道远程端队列管理器上的表示形式。如果通道发送端未能转换消息,则将消息写到发送端的死信队列。

完全由字符组成的消息可由内置的转换例程来进行转换。如果消息包含 WebSphere MQ 中定义的结构,也可以使用内置转换例程来进行转换。如果这两个条件都不成立,则必须由数据转换出口来执行转换。





回页首


数据转换出口是一个用户编写的程序,它为 WebSphere MQ 无法使用其内置例程来转换的应用程序数据执行数据转换。若要编写数据转换出口:

  1. 为您的应用程序数据的消息格式创建一个名称。
  2. 创建一个结构来表示该消息。
  3. 使用所提供的实用程序来创建数据转换出口的代码片段。
  4. 复制所提供的骨架源文件,并将其重命名为您的消息格式名称。
  5. 将实用程序提供的代码片段复制到您的源文件中,并编写转换所需的任何专用代码。
  6. 编译该程序并将其放在 WebSphere MQ 安装中的适当目录中。

WebSphere MQ Application Programming Guide(请参见参考资料)中记录了为每种平台编写数据转换出口的详细信息。

检测是否需要应用程序数据转换与任何数据转换出口无关。如果需要转换,并且消息格式为内置转换例程之一所能处理的格式,则不需要数据转换出口。

如果需要某个数据转换出口,则会调用它。该出口的返回值指示转换是否成功。如果成功,则将出口返回的转换数据传递给应用程序。如果不成功,则将未转换的数据连同完成代码和原因一起返回给应用程序。





回页首


应用程序开发人员应该遵守以下建议来确保正确的数据转换。

  • 在每个消息的消息描述符的 EncodingCodedCharSetId 字段中放置以下值:
    • MQENC_NATIVE,表示本地编码
    • MQCCSI_Q_MGR,表示与队列管理器相同的 CCSID
  • 在每条消息的消息描述符的 Format 字段中放置一个格式名称。例如:
    • MQFMT_STRING,表示完全由字符组成的消息。
  • 在 MQGET 调用上使用 MQGMO_CONVERT 选项。检查 MQGET 调用所传递的内容;消息可能还未转换。

成功的转换依赖于正确设置了消息描述符中的 EncodingCodedCharSetIdFormat 字段的消息发送者。即使消息的目标并不需要转换,应用程序程序员也应该养成这样做的习惯,因为它将来可能需要转换。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

远程管理

下面让我们看一下远程管理队列管理器的方法。这里的讨论包括检测事件和死信队列,这些内容虽然并不明确与远程管理相关,但是出于管理问题的完整性而包括了它们。

所有队列管理器都有一个属于系统队列的命令队列 SYSTEM.ADMIN.COMMAND.QUEUE,旨在支持从“单一控制点”进行远程管理。这些命令的消息格式为可编程命令格式 (PCF)。可以将消息发送到远程命令队列。

队列管理器提供一个命令服务器 来处理命令队列上的消息。控制命令 strmqcsv 启动命令服务器,后者必须针对某个要启用远程管理的队列管理器运行。

支持 PCF 命令的管理实用程序包括 WebSphere MQ SupportPac、第三方供应商产品和间接模式下的 runmqsc 命令。

WebSphere MQ 管理接口(WebSphere MQ Administration Interface,MQAI)是作为用于发送和接收 PCF 命令的编程接口来提供的。





回页首


到目前为止,您已在直接模式 下使用了 runmqsc。在直接模式下,runmqsc 连接到目标队列管理器,发出 MQSC 命令,并产生结果报告。

还存在一种使用 runmqsc间接模式,其中改为将 MQSC 命令发送到某个命令队列,并且命令服务器发送用于格式化报告的应答。

在间接模式下,MQSC 命令通过 Escape PCF 命令来封装。Escape PCF 命令在消息文本中包含 MQSC 命令。

在间接模式下,runmqsc 读取 MQSC 命令,在 Escape PCF 命令中将它们发送到目标队列管理器(可以是远程的)的命令队列,等待应答,并基于接收到的应答编写报告。





回页首


正如在第 1 部分中所指出的,WebSphere MQ Explorer 提供了一个用于管理 WebSphere MQ 的图形用户界面。WebSphere MQ Explorer 同时对 Windows 和 Linux 平台可用。然而,虽然它仅在那些平台上运行,但是可以使用它来管理任何平台上的 WebSphere MQ。这是用于“单点控制”远程管理的最佳选择之一。





回页首


检测事件 是队列管理器所检测的条件的逻辑组合。当某个检测事件发生时,队列管理器在一个事件队列上放置一条事件消息。事件消息的格式基于 PCF 命令的格式。每个类别的检测事件都有自己的事件队列。下表显示了四个类别的检测事件、对应的事件队列和每类事件的示例。



类别 事件队列 示例
队列管理器 SYSTEM.ADMIN.QMGR.EVENT 尝试将消息放置到已禁用 Put 请求的队列。

在没有所需权限的情况下尝试打开队列。
性能 SYSTEM.ADMIN.PERFM.EVENT 队列深度达到预定义的阈值。

队列已满。
通道 SYSTEM.ADMIN.CHANNEL.EVENT 某个通道启动。

某个通道停止。

应用程序数据转换在消息通道的发送端失败。
配置 SYSTEM.ADMIN.CONFIG.EVENT 创建某个对象。

删除某个对象。

创建某个名称列表。

WebSphere MQ 没有提供用于读取事件消息的应用程序,但是有一个 SupportPac 提供了此功能。





回页首


队列管理器使用死信队列 来存储它无法传递的消息。

当异步地检测到某个与消息相关的问题时,则会应邀生成异常报告,并将该报告发送到指定的应答队列。报告消息的消息描述符中的 Feedback 字段指示了报告的原因。原始消息将放在死信队列上。

如果无法在消息通道的接收端传递某个消息,则将它放在死信队列上(如果定义了死信队列的话)。

如果消息通道发送端的通道定义中指定了 CONVERT(YES),并且无法转换某个消息,则将该消息放置到发送端的死信队列上。

如果死信队列在需要时不可用,则通道会停止。因此,建议为每个队列管理器定义一个死信队列。





回页首


死信队列处理程序 提供了一种处理死信队列上的消息的自动化方法。死信队列处理程序通过 runmqdlq 控制命令来调用。它可以接受一个队列名称和一个队列管理器名称作为参数;否则,它就采用缺省队列管理器的死信队列。

死信队列处理程序由规则表驱动,后者是从标准输入设备读取的。该表中必须至少有一个规则。规则可以匹配目标队列名称、消息类型、Feedback 字段内容,等等。规则的操作可能指示死信队列处理程序应该重新尝试将消息放到其目标队列上,或者将其转发到另一个队列,或者丢弃它,或者只是将其保留在死信队列上。

即使您没有使用死信队列处理程序,也不允许将死信队列装满(达到其最大深度)。

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

安全性

WebSphere MQ 提供的主要安全组件是访问控制。这允许 WebSphere MQ 控制哪些用户有权对 WebSphere MQ 资源进行什么类型的访问。可通过这种方式来控制的资源包括:队列管理器、队列、名称列表和进程。

WebSphere MQ 提供 Object Authority Manager (OAM) 作为授权服务。OAM 为 WebSphere MQ 提供了全套访问控制功能,同时包括访问控制检查和用于设置、更改以及查询 WebSphere MQ 访问控制信息的命令。可以使用符合正确接口的用户或供应商提供的组件来取代 OAM。

WebSphere MQ 在 MQCONN 上捕获与应用程序关联的用户标识符。此用户标识符用于访问控制检查。获得适当授权的用户可以使用替代用户标识符而不是登录用户 ID。当 WebSphere MQ 检查用户是否允许访问某个特定资源时,用于该检查的是在 MQI 调用中指定的名称。

在别名或远程队列定义的情况下,用于访问检查的仍然是在 MQI 调用中指定的队列名称,而不是所解析到的名称。因此,用户需要访问指定的资源,而不是所解析到的资源。可以不授予对本地队列的访问权限,而是只授予对它所解析到的别名队列的访问权限。而且,这也指出了定义队列的能力应该仅限于特权用户。否则,只需创建一个别名队列即可绕过通常的访问控制。





回页首


有三个控制命令为 WebSphere MQ 提供了安全环境控制:setmqautdspmqautdmpmqaut。这些程序需要连接到授权服务,因此只能在目标队列处于活动状态并且启用了 OAM 的时候使用。对这些命令的所有响应都显示在标准输出设备上。

命令 用途
setmqaut 用于授予或撤销具有特定类型和特定名称的特定队列管理器的 WebSphere MQ 对象的 OAM 权限。名称参数可以包含通配符星号 (*) 以允许指定一组名称。

在使用 setmqaut 对某个正在运行的队列做出更改以后,务必针对该队列管理器发出 REFRESH SECURITY MQSC 命令,以刷新权限信息缓存。

dspmqaut 用于显示权限,这些权限将根据某个特定对象的特定用户标识符或组标识符进行解析。
dmpmqaut 具有与 dspmqaut 命令相似的用途,但是提供更多的详细信息。如果尝试确定为何某个特定用户标识符被授予 dspmqaut 命令所显示的权限(例如,由于组成员资格),则此命令特别有用。

WebSphere MQ System Administration Guide 提供了关于这些命令的更多信息(请参见参考资料)。





回页首


对 WebSphere MQ 控制命令的访问是受限制的,具体取决于平台。通常,已定义的 WebSphere MQ 管理员或系统管理员组是唯一允许访问这些命令的用户。





回页首


权限检查是在应用程序发出 MQCONN、MQCONNX、MQOPEN 或 MQPUT1 调用时执行的。通常,在发出 MQCLOSE 时不执行检查,但是会引发异常。当发出 MQCLOSE 调用以删除某个永久动态队列,并且该队列使用的对象句柄与创建该队列的 MQOPEN 调用所返回的对象句柄不同时,则会执行检查以确保应用程序拥有删除权限。

如果应用程序无权访问某个 WebSphere MQ 对象来进行请求的操作,则该 MQI 调用会返回原因代码 MQRC_NOT_AUTHORIZED。

在尝试访问某个还没有授予访问权限的资源时,队列管理器会生成审核记录。这些记录作为消息被写到 SYSTEM.ADMIN.QMGR.EVENT 队列。





回页首


在定义消息通道的接收端时,有一个选项允许您指定将要使用的用户标识符,用于检查接收 MCA 打开目标队列的权限,以便将消息放在该队列上面。您可以选择以下用户标识符之一:

  • 缺省用户标识符
    • 使用接收 MCA 的缺省用户标识符。此用户标识符可由安全出口更改,或者通过设置消息通道接收端通道定义中的 MCAUSER 参数来更改。
  • 上下文用户标识符
    • 使用消息上下文中的用户标识符。

传输队列通常应该仅由队列管理器使用,应用程序一般不应该直接访问它。然而,如果存在特殊的系统程序,它们的确直接将消息放在传输队列上,则应该授予它们所需的权限。





回页首


消息上下文允许检索消息的应用程序了解有关消息发起者的信息。检索应用程序可以使用该信息来检查发送应用程序是否拥有正确的权限级别,或者保留它已使用的所有消息的审核记录。

存在两类上下文,即标识来源,它们保存在消息描述符中的一组字段中。通过在 MQPUT 或 MQPUT1 调用上使用放置消息选项 MQPMO_DEFAULT_CONTEXT,应用程序可以请求队列管理器设置消息的上下文字段。这是没有指定上下文选项时的缺省操作。

标识上下文
包括以下字段:
  • UserIdentifier——发起消息的用户。
  • AccountingToken——队列管理器将此字段中的信息视为二进制信息而不是字符信息。此字段的值取决于平台。
  • ApplIdentityData——与标识有关的应用程序数据。

来源上下文
包括以下字段:
  • PutApplType——放置消息的应用程序类型。
  • PutApplName——放置消息的应用程序名称。
  • PutDate——放置消息的日期。
  • PutTime——放置消息的时间。
  • ApplOriginData——与来源有关的应用程序数据。

通过指定放置消息选项 MQPMO_NO_CONTEXT,应用程序可以选择放置无上下文的消息。在此情况下,队列管理器会清除所有上下文字段。明确地说,它将字段 PutApplType 设置为 MQAT_NO_CONTEXT,以便接收应用程序能够测试该值。

当队列管理器生成报告时,它将标识上下文设置为与原始消息的标识上下文相同。当应用程序生成应答或报告时,一般最好遵循同样的约定。

若要使用相同的标识上下文来转发消息或发送应答,应用程序需要执行以下操作:

  • 使用选项 save all context 来打开输入队列。
  • 使用选项 pass identity contextpass all context 来打开输出队列。
  • 从输入队列中获取一个消息。
  • 使用选项 pass identity contextpass all context 来将该消息或应答放置到输出队列上。

如果原始消息没有上下文,应用程序可以使用选项 no context 来转发它。

替代用户权限通过为队列管理器提供与当前在其下运行应用程序的用户身份不同的用户身份,从而允许应用程序打开队列或任何其他 WebSphere MQ 对象。队列管理器使用此替代用户标识符来检查它是否有权打开队列。

通常,此选项由代表其他应用程序工作的服务器应用程序使用。该服务器应用程序从它当前处理的消息上下文中获得替代用户标识符。





回页首


通道出口程序提供了在消息通道和 MQI 通道上采取附加的自定义安全措施的机会。然而,通道出口需要附加的设置,并且不是 WebSphere MQ 提供的“现成”安全性的一部分。有关更多详细信息,请参见第 1 部分中的通道出口讨论。

要知道,如果使用 MQSERVER 环境变量来定义客户端连接,则无法在 MQI 通道的客户端调用任何通道出口程序。如果在客户端使用客户端连接定义表,则消息和消息重试出口将不适用,因为 MQI 通道用于流动 MQI 调用的输入和输出参数,而不是用于流动消息。





回页首


安全套接字层 (SSL) 是用于安全通信的行业标准协议,它涉及到加密、身份验证和数据的完整性。SSL 同时在客户机/服务器和队列管理器/队列管理器通道(包括集群)中受支持。SSL 存在许多内置的灵活功能,包括能够基于经过完全验证的身份来选择谁将接受通信。在大多数安装中,这排除了为安全目的而设置通道出口的需要。

SSL 在 Internet 社区得到广泛接受,并且已经过了大量的测试。其加密技术可以防止窃听通信,它提供的数字签名可以防止篡改所传递的数据,数字证书提供了强有力的身份验证。

使用 SSL 来建立通信的过程称为“握手”,如下所示。

  1. SSL 客户端发送一个“客户端问候”消息,其中列出诸如 SSL 版本等加密信息,并以客户端的首选顺序列出客户端支持的密码套件。该消息还包含在后续计算中使用的随机字节字符串。

    SSL 协议允许“客户端问候”包括该客户端支持的数据压缩方法,但是 SSL 实现通常不包括此功能。

  2. SSL 服务器使用一条“服务器问候”消息来响应,其中包含服务器从 SSL 客户端提供的列表中选择的密码套件、会话 ID 和另一个随机字节字符串。

    SSL 服务器还发送其数字证书。如果服务器需要数字证书来进行客户端身份验证,则服务器会发送一个客户端证书请求,其中包括支持的证书类型列表和可接受的证书颁发机构 (CA) 区别名称。

  3. SSL 客户端检验 SSL 服务器数字证书上的数字签名,并检查服务器选择的密码套件是否可接受。

  4. SSL 客户端发送随机字节字符串,用于同时启用客户端和服务器,以计算将用于对后续消息数据加密的机密密钥。该随机字节字符串本身使用服务器的公钥来加密。

  5. 如果 SSL 服务器发送客户端证书请求,则 SSL 客户端将发送使用客户端私钥来加密的随机字节字符串,再加上客户端的数字证书,否则就会发出关于没有数字证书的警报。

    该警报只是一个警告,但是对于有些实现,如果客户端身份验证是必需的,则握手就会失败。

  6. SSL 服务器验证客户端证书上的签名。

  7. SSL 客户端向 SSL 服务器发送一个使用机密密钥来加密的“结束”消息,指示握手过程的客户端部分已经完成。

  8. SSL 服务器向 SSL 客户端发送一个使用机密密钥来加密的“结束”消息,指示握手过程的服务器部分已经完成。

  9. 在 SSL 会话的持续时间内,SSL 服务器和 SSL 客户端现在可以交换使用共享机密密钥来对称加密的消息了。

队列管理器定义中的以下属性提供了有关队列管理器的 SSL 使用信息。

属性 定义
SSLKEYR SSL 密钥存储库名称。
SSLCRLNL 身份验证信息对象名称列表的名称。
SSLCRYP 配置系统上存在的加密硬件所需要的参数字符串名称。
SSLTASKS 用于处理 SSL 调用的服务器子任务数量。

队列管理器身份验证对象包含所需的定义,用于通过 LDAP 服务器来执行证书吊销列表 (CRL) 检查。您可以使用命令 ALTER AUTHINFO、DEFINE AUTHINFO、DELETE AUTHINFODISPLAY AUTHINFO 来修改、定义、删除或显示这些对象。

通道定义中的以下属性提供了有关通道上的 SSL 使用的信息。

属性 定义
SSLCIPH 指定加密强度和功能 (CipherSpec)。通道两端的此属性必须匹配。
SSLPEER 指定允许合作伙伴的区别名称(唯一标识符)。
SSLCAUTH 定义 WebSphere MQ 是否需要并验证来自 SSL 客户端的证书。


WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ SupportPac

WebSphere MQ SupportPac 库包含用于补充 IBM 推出的 WebSphere MQ 产品系列的材料。每个 SupportPac 提供特定的功能或服务,可用于一个或多个 WebSphere MQ 产品。许多 SupportPac 可供免费下载,而其他则必须作为收费服务来从 IBM 购买。

SupportPac 分组为以下类别:

类别 1——免费服务
此类别中的 SupportPac 提供将由 IBM 系统专家使用的材料,用作与客户签订收费服务合同的基础。它们已在 SupportPac 库中公告,但是其内容仅对 IBM 人员可用。

希望获得基于该材料的服务的客户应该与他们的 IBM 代表联系。

类别 2——免费软件
此类别中的 SupportPac 向所有 WebSphere MQ 产品用户免费提供。它们提供的材料通常涵盖以下领域:
  • 关于 WebSphere MQ 产品的背景教育。
  • 辅助基于 WebSphere MQ 的应用程序开发的示例实用程序。
  • 辅助基于 WebSphere MQ 的系统操作和管理的示例实用程序。

此类材料按原样提供,在其下提供这些 SupportPac 的许可协议不提供担保和缺陷修正。

类别 3——产品扩展
产品扩展向所有 WebSphere MQ 产品用户免费提供。它们在 IBM International Program License Agreement (IPLA) 所提供的标准条款和条件下提供,因此提供了担保或缺陷修正。它们的质量和支持与对应的 WebSphere MQ 产品相同。

类别 4——第三方贡献
这些 SupportPac 由第三方提供,并且其提供和许可方式与类别 2 的 SupportPac 相同。

让我们看一下两个可用于 WebSphere MQ 的 SupportPac 示例。





回页首


此 SupportPac 包含三个实用程序:一个事件队列监视器、一个死信队列监视器,以及一个用于删除过期消息的程序。

事件队列监视器在事件队列上等待,并在某个事件消息到达该队列时向用户发出警报。它将消息内容以可读格式写到标准输出设备。其源代码是关于如何分析事件消息的有用示例,其格式基于 PCF 命令的格式。

死信队列监视器在死信队列上等待,并在某个消息到达该队列时向用户发出警报。它将死信标头以可读格式写到标准输出设备。其源代码是关于如何编写死信队列处理程序的有用示例。

过期消息删除程序浏览队列管理器中存在的每个消息,以便删除任何已到达其过期时间的消息。这对于保持队列存储处于受控状态是非常有用的。其源代码是关于如何从命令服务器获得信息的理想示例。





回页首


此 SupportPac 询问为某个队列管理器(无论是本地还是远程)定义的所有对象的属性,并将它们保存到一个文件。该文件的格式适合于供 runmqsc 使用。因此可以使用此 SupportPac 来保存某个队列管理器已知的对象定义,并在以后重新创建该队列管理器。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

WebSphere MQ for z/OS 注意事项

本教程中提供的大多数信息都适用于可以使用 WebSphere MQ 的大多数平台。然而,WebSphere MQ for z/OS 的确有一些应该注意的区别。本部分讨论一些重要的区别,但肯定没有全部包括它们。只有通过使用 WebSphere MQ for z/OS 和其他平台上的 WebSphere MQ、只有通过学习 WebSphere MQ for z/OS 文档,您才有望了解平台之间的所有区别。

不存在针对 WebSphere MQ for z/OS 的Quick Beginnings 指南。相反,应该使用 z/OS: Concepts and Planning Guidez/OS: System Setup Guide 来获得规划和实现信息(请参见参考资料)。

WebSphere MQ for z/OS 具有自己的System Administration Guide,还具有一个 Problem Determination Guide





回页首


WebSphere MQ for z/OS 能够在队列中的消息的 GROUPID、MSGID、MSGTOKEN 和 CORRELID 字段上创建索引,以提高使用那些字段的 MQGET 操作的速度。此功能在其他平台上不可用。





回页首


WebSphere MQ for z/OS 没有提供发布/订阅代理。





回页首


WebSphere MQ for z/OS 不支持分发列表。





回页首


WebSphere MQ for z/OS 上的日志记录和恢复注意事项与其他平台不同。z/OS: Concepts and Planning Guide 详细介绍了这些注意事项。

但是很重要的一点在于,WebSphere MQ for z/OS 能够以两种不同的方式创建恢复点:

  • 完全备份
    • 停止队列管理器后,可以通过备份的数据和该完全备份点以后的日志来执行恢复。
  • 模糊备份
    • 在队列管理器运行的同时执行备份。如果关联的日志被破坏或丢失,则无法使用模糊备份来执行恢复。





回页首


虽然 WebSphere MQ Explorer 能够远程管理所有平台上的 WebSphere MQ,包括 z/OS,但它只能管理 WebSphere MQ for z/OS V6.0 队列管理器。WebSphere MQ for z/OS 的早期版本无法使用 WebSphere MQ Explorer 来进行管理。





回页首


WebSphere MQ for z/OS 支持创建队列共享组。队列共享组的成员是在连接 z/OS 系统时创建的同一个 Sysplex 中的队列管理器。队列共享组中的每个队列管理器都可以访问该组中所有共享队列上的任何消息。共享队列还可以作为集群队列来参加。





回页首


WebSphere MQ for z/OS 对象上的权限检查是在 WebSphere MQ 外部由资源访问控制设施(Resource Access Control Facility,RACF)来执行的。检查的执行情况与使用 OAM 时的情况相同。

 

WebSphere MQ Solution Designer 认证考试 996 准备: 第 3 部分,分布式队列管理

总结

本教程讨论了分布式队列管理的各个方面,包括配置、应用程序数据转换和 WebSphere MQ 客户端。其中还讨论了如何处理异常和安全问题。完成本系列中的五个教程可以帮助您获得所需的知识以准备考试 996:IBM WebSphere MQ V6.0, Solution Design,但是决不取代您通过使用产品和学习文档所获得的经验和知识。

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

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • WebSphere MQ Solution Designer 认证考试准备系列:使用这个包括五个教程的系列来帮助您准备 IBM 认证考试 996:WebSphere MQ V6.0, Solution Design。

  • 获得“IBM 认证解决方案设计师——WebSphere MQ V6.0”认证。查看考试 996: 的目标、示例评估测试和培训资源。

  • 阅读 IBM 红皮书™ 以获得对 WebSphere MQ 的广泛技术了解。

  • 使用 来获得有关 WebSphere MQ 的详细文档。

  • 了解关于 developerWorks 技术活动和网络广播的最新消息。


获得产品和技术


讨论

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