WEBSPHERE MQ实践

WEBSPHERE MQ实践
 
(由于本文格式已经错乱,请在 http://www.itpub.net/thread-1175076-1-1.html下载相关doc文件及附件)
最近以来,工作中一直在使用WebSphere的 MQ产品,切实感觉到MQ作为消息中间件,在消息传递方面的强大功能,本文将详细描述MQ通讯的原理,并结合实例向大家展示MQ在java开发方面的一些技巧,由于很少在网上看到关于MQ比较复杂一点的通讯实例,抛砖引玉,希望对大家有所帮助。
简介
 WebSphere MQ是一种面向对象的消息中间件,用于异构应用之间的消息传递,应用程序通过MQ接口进行通讯, WebSphere MQ支持多协议消息通讯,可以最大限度地简化网络编程,同时MQ支持多中平台,对消息支持交易式的提交和回滚,是一款非常不错的产品。
 本文首先将介绍MQ的通讯的一些知识,然后结合java开发实例,着重描述MQ在两个队列管理器的同步通讯过程,其中包括MQ的安装、配置、相关java代码开发等。
MQ基础知识
MQ的通讯过程中一般会用到这么几个组建:队列管理器、队列、通道,接下来就本文会使用到的一些基础感念做简单介绍。
消息
消息就是MQ通讯的内容,是应用程序之间传递的信息载体,消息(按照WebSphere MQ队列管理器启动后,是否仍然保持)分为持久消息和非持久消息,一般把异步通讯配置为持久消息,同步通讯配置为非持久消息,本文有些地方也将消息称为报文。
队列
 队列就是消息的寄存器,在通讯时,消息被添加到队列中后发送出去。队列分为本地队列、远程队列、别名队列等,本地队列是当前队列管理器中需要配置的,区别于本地队列,远程队列是指向远程队列管理器中的本地队列,本地队列又分为本地初始化队列、传输队列、目标队列、死进队列等,初始化队列作为消息触发,传输队列用来暂存待传输的消息,如果消息没有发送出去,最终会存放在死进队列中。本文中主要本地初始化队列、本地传输和远程队列。
队列管理器
 队列管理器也就是MQ的运行环境,维护和管理消息队列,向应用程序提供消息服务。应用程序连接到队列管理器的监听端口,访问队列管理器的队列,接收并发送消息,本文将建立2个队列管理器,模拟2个不同物理地址的MQ通讯,分别用来进行消息(报文)的发送端和接收端。
通道
通道是2个队列管理器之间的一种单向的点对点的通信连接。通道分为发送方通道、接收方通道、服务器连接通道等。消息通过发送方通道传递到目的队列管理器的接收方通道。发送方通道配置通道的时候需要选择通讯协议,本文将使用TCP协议。
MQ环境部署
694276_200906101101581.thumb.jpg
由上边的图我们可以看到,MQ的消息发送和接收过程大致如下(如图中红色和黑色的箭头,分别代表发送实时报文和异步报文的发送过程):消息发送时,队列管理器A中,消息通过实时发送队列进行发送,并在实时发送传输队列进行缓存,然后通过实时发送方通道连接到队列管理器B,再通过传输队列的缓存,然后被实时接收方队列截获并处理,在队列管理器B的消息被处理过后通过实时发送队列返回处理结果,再通过实时传输队列的缓存和实时接收方通道的传递,最终被队列管理器A的实时接收队列捕获。
我们接下来也将模拟整个实时报文传递的过程:
整个过程需要配置的MQ组建如下:
首先:建立2个队列管理器A和B,一个作为客户端,进行消息的发送;另一个作为服务器端,截获并处理消息,本例中将他们配置在同一台电脑上进行测试,在实际生产环境中,可以将分别建立在不同的主机上。
然后:需要分别在各个队列管理器上建立如上图所示的队列,包括发送队列、接受队列、传输队列。同时为了区分异步环境下的消息发送过程,还可以建立批量发送队列,批量接收队列、批量传递队列。
其次:需要建立发送和接收方通道。
另:由于本文是通过java来连接MQ,并进行消息发送的,故此还需要在各个队列管理器上建立java的监听端口,和服务器连接通道,这样java程序就可以通过MQ的监听器端口连接到MQ上。
这样的话,我们把需要配置的MQ组建可以归纳如下:
需要配置的队列管理器
名称 描述
QM_TIPS_2027100000_01 作为客户端,进行报文发送
QM_TIPS_2600_01 作为服务器端,接收并处理报文
需要配置的队列
名称 作用队列管理器 类型 描述
PBC.202710000010.ONLINE.OUT QM_TIPS_2027100000_01 本地 实时消息接收队列
PBC.2600.ONLINE.TRAN QM_TIPS_2027100000_01 本地 实时消息传输队列
PBC.EXT.ONLINE.IN QM_TIPS_2027100000_01 远程 实时消息发送队列
PBC.202710000010.BATCH.OUT QM_TIPS_2027100000_01 本地 异步消息接收队列
PBC.2600.BATCH.TRAN QM_TIPS_2027100000_01 本地 异步消息传输队列
PBC.EXT.BATCH.IN QM_TIPS_2027100000_01 远程 异步消息发送队列
PBC.2027100000.ONLINE.TRAN QM_TIPS_2600_01 本地 实时消息传输队列
PBC.2600.ONLINE.OUT QM_TIPS_2600_01 本地 实时消息接收队列
PBC.EXT.ONLINE.IN QM_TIPS_2600_01 远程 实时消息发送队列
PBC.2027100000.BATCH.TRAN QM_TIPS_2600_01 本地 异步消息传输队列
PBC.2600.BATCH.OUT QM_TIPS_2600_01 本地 异步消息接收队列
PBC.EXT.BATCH.IN QM_TIPS_2600_01 远程 异步消息发送队列
需要配置的通道
名称 作用队列管理器 类型 描述
202710000010.2600.O1 QM_TIPS_2027100000_01 发送方 实时消息发送通道
202270000010.2600.B1 QM_TIPS_2027100000_01 发送方 异步消息发送通道
2600.202710000010.O1 QM_TIPS_2027100000_01 接收方 实时消息接收通道
2600.202710000010.B1 QM_TIPS_2027100000_01 接收方 异步消息接收通道
SVRCONN QM_TIPS_2027100000_01 服务器连接 服务器连接通道
202710000010.2600.O1 QM_TIPS_2600_01 接收方 实时消息接收通道
2600.202710000010.O1 QM_TIPS_2600_01 发送方 实时消息发送通道
202270000010.2600.B1 QM_TIPS_2600_01 接收方 异步消息接收通道
2600.202710000010.B1 QM_TIPS_2600_01 发送方 异步消息发送通道
SVRCONN1 QM_TIPS_2600_01 服务器连接 服务器连接通道
需要配置的侦听器
名称 作用队列管理器 侦听端口 类型 描述
LSR.2027100000 QM_TIPS_2027100000_01 9009 TCP MQ侦听器
LSR.2600 QM_TIPS_2600_01 1415 TCP MQ侦听器
 OK大致就这些了,下边附上MQ安装和配置文件(MQ安装和配置.doc),里边每一步都有图例,这里就不赘述了
Java环境
  694276_200906101101582.thumb.jpg
如上图所示:本文中测试环境采用Java Socket、Thread的方式,用户在Java客户端通过Socket连接至Java服务器端监听端口;Java服务器端通过Socket监听捕获客户端发送的消息,并通过私有线程将消息发送至MQ客户端;MQ客户端通过MQ组件将消息发送到MQ服务器端;MQ服务器端需要建立消息响应机制,处理并返回处理结果,处理后的消息按原路返回至Java客户端。
综上所述:开发过程需要如下3类代码
1. Java 客户端:
主要完成任务:连接Java服务端Socket,发送消息,并等待Java服务器端返回处理结果
2. Socket 服务端
向Java客户端提供Socket服务,当收到客户端的Socket请求后,通过操纵MQ客户端发送队列,将请求消息发送至MQ客户端,之后捕获MQ客户端接收队列返回的消息,将捕获的消息处理后返回给Java客户端,因为考虑到实际环境中存在Java客户端的并发请求,这里在从Socket服务端截取消息时,需要增加线程的处理,另外需要增加对MQ客户端队列管理器的并发处理逻辑。
3. MQ服务器端相关代码
需要获取MQ服务器端接收到的消息,在对消息进行加工处理后,回置处理结果给MQ客户端。
 在本文Java开发过程中,针对上述3类代码,生成如下8个java文件。
MQ服务器端相关代码
1. MQTest.java文件
该文件通过操作服务端MQ,对服务端MQ队列中的消息进行实时捕获,在经过处理过的消息提交发送队列,返回给客户端MQ。
2. SskkRcvServerFrame.java文件
该文件提供图形化界面如下图所示,用户在输入服务端MQ的相关配置参数后,点击“连接”按钮就可以连接到对应MQ服务端,并将MQTest.java中捕获到的消息显示在页面上。同时提供以下人性化操作:1.显示消息,将MQ服务端的消息显示到图形化街面上;2.保存消息,将页面显示的消息导出至文件;3.清除消息,将页面上显示的消息清除。
694276_200906101101583.thumb.jpg
Java客户端代码
1. ColentSocket1.java文件
该文件主要是连接Socket服务端端口,并完成发送消的简单功能
Java服务端代码
1. TestSocket1.java文件
作为Socket服务端代码,提供Socket连接端口,并捕获Socket端口的连接,在Java客户端有Socket请求后,将处理过程分配给NewThreadSend1.java文件处理,该文件是一个java线程,这样TestSocket1.java就可以继续处理其他的Socket客户单连接,而不用等待NewThreadSend1.java做后续的处理。同时提高了程序的并发,这也是实际环境所必需的。
2. NewThreadSend1.java文件
该文件中读取Socket服务端的消息,将并调用SendService.java文件,进行消息发送。
3. SendService.java文件
该文件完成连接MQ客户端,发送报文,并获取MQ客户端的队列返回的消息。
4. QMGRINIT1.Java文件
由于需要频繁MQ操作队列管理进行收发消息操作,考虑到在实际环境中不能频繁打开和关闭队列管理器,这里增加队列管理器的并发操作(模拟数据库连接池的功能): 1.在处理化的时候打开5个MQ队列管理器;2.每次拿到其中的一个进行消息的收发;3.采用循环算法,取到当前没有实用的MQ队列管理器;4.如果所有MQ队列管理器都在使用,则需要新打开一个;5.新打开的队列管理器在使用完之后需要断开连接,保证正常请款下MQ的队列管理器的连接数为5(MQ队列管理器打开数量有上限)。
5. AbsThread1.java文件
Java服务器端代码有大量线程操作,这里提供一个公共线程接口。
好了不多说了,下来分享代码。
Java测试环境构建
其实谈不上构建了,就只简单的拷贝文件而已,大致如下:
1. 新建工程,可以使用任何java开发工具Eclipse等,新建java工程
2. 导入MQ所需的jar包
3. 拷贝上边的代码到新建工程中
测试环境运行
1. 运行MQ服务器端:SskkRcvServerFrame.java
2. 运行Socket服务端:TestSocket1.java
3. 运行Java客户端:ColentSocket1.java,此文件可以批量运行,模拟并发操作。
运行结果如下:
1. MQ服务器端:
694276_200906101101584.thumb.jpg
2. 运行Socket服务端:
第1次测试数据
111 ==========第1测试数据:Tue Jun 09 14:44:54 CST 2009
队列管理器初始化开始
队列0创建成功
队列1创建成功
队列2创建成功
队列3创建成功
队列4创建成功
队列管理器初始化结束
QueueCount=0
第1测试数据:正在使用第0个队列管理器进行队列发送
222 ==========第0测试数据:Tue Jun 09 14:44:55 CST 2009
333 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
444 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
msgID=1244529895171=293432.9111992495
555 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
666 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
777 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
接收报文string=myfriend2010发送消息给队列管理器
第1测试数据:释放队列管理器0
end ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
第2次测试数据
111 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
QueueCount=1
第2测试数据:正在使用第1个队列管理器进行队列发送
222 ==========第1测试数据:Tue Jun 09 14:44:55 CST 2009
333 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
444 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
msgID=1244529895984=8379714.178473684
555 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
666 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
777 ==========第2测试数据:Tue Jun 09 14:44:55 CST 2009
接收报文string=myfriend2010发送消息给队列管理器
第2测试数据:释放队列管理器1
end ==========第2测试数据:Tue Jun 09 14:44:56 CST 2009
3. Java客户端:

总结:
本文构建了2个节点MQ环境,对MQ同步和异步报文有较详细的配置,并测试了Java操作WebSphere MQ,发送和接收实时报文的逻辑,希望对大家有所帮助。
WebSphere的 MQ是一个优秀的消息中间件,在消息传输的可靠性、高效、安全等方面有着非常好的性能。由于本人水平有限,暂时只能到此为止,不足之处在所难免,恳请大家不吝指正,同时对MQ的研究永远没有终点,希望大家再接再厉。
本文中对MQ部分名词的解释,属于个人的比较片面的理解,如要深入理解相关知识,请翻阅专业资料。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/694276/viewspace-605788/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/694276/viewspace-605788/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值