WebSphere MQ(以下简称MQ)是IBM公司享有盛誉的商业通信中间件它被世界范围的许多大型企业广泛采用它提供一个具有工业标准安全可靠的消息传输系统MQ基本由一个消息传输系统和一个应用程序接口组成应用程序使用MQ的API(消息队列接口MQI)函数和队列管理器(MQ运行时刻的程序)进行通信队列管理器在工作时它需要用到对象如队列和通道同时队列管理器也是一个对象图所示为MQ应用程序在运行时刻的图示
图 运行时刻的MQ消息是一个信息单元它由两部分组成从一个程序发往另外一个程序的应用程序数据以及消息描述符或者消息头
消息描述符用来标识消息(message ID)同时它还包括一些控制信息如消息类型消息过期的时间消息优先级等等
一条消息的最大长度为MB默认的最大消息长度为MB消息的最大长度依赖于MQ的版本MQ第五版支持消息的最大长度为MB
队列是一个安全的存储消息的地方消息的存储一般是有顺序的因为消息存放在队列中所以应用程序可以以不同的速度在不同的时间不同的地点相互独立的运行
消息队列通信是应用程序之间进行通信的一种方式应用程序在没有专有连接或者物理连接的情况下能够通过向队列写入或读出消息进行通信也即程序之间不是通过互相调用而是通过向队列发送数据来进行通信在这种通信方式下应用程序不需要具有并发性对于异步的消息通信程序发送方不需要专门等待已发消息的回复而是可以处理下一个事件与之相对的是同步消息通信在处理下一个事件之前必须等待已发消息的回复对于用户来说底层的协议是透明的用户只需要考虑会话的程序或数据入口
MQ应用于客户机/服务器模式或者分布式系统应用程序可以工作在一个工作站上也可以运行在不同平台的不同机器上应用程序具有很好的移植性能够轻松的从一个系统或者平台转移到另一个系统或者平台程序的编写支持多种语言包括Java同样的队列也适合许多不同的平台
因为MQ通过队列进行通信所以它可以被看成是使用间接的程序程序方式通信程序员可以不指定接收消息的目标程序的名称但是可以指定接收消息的队列的名称每一个队列和一个程序相联系一个程序可以有一个或者多个接收队列而且可以有多个输出队列输出队列包含着很多信息这些信息可以是用来供服务器处理的也可以是返还给发送消息的客户端的回复信息
使用MQ进行通信时程序员不必担心目标程序是否可用或是否繁忙甚至不用考虑目标机器是否正常运行或者是否连接上了程序员发送消息给目标队列而目标队列是和目标程序相联系的目标程序可能目前不可用不用担心MQ能够解决这种情况如果需要它甚至能够启动目标程序
如果目标程序不可用消息会停留在队列中稍后再被处理队列可以在发送消息的机器中也可以在接收消息的机器中这取决于两台机器的两个系统之间是否能够建立连接应用程序可以整天运行也可以采用激发机制所谓激发就是指当有一条或数条消息到达队列时自动启动某个程序
图 消息和队列图说明了两个应用程序A和B之间是如何进行通信的可以看到有两个队列各队列里面存放着要接收或者发送的消息
程序和队列之间的方形图表示MQI(消息队列接口API)程序就是使用MQI来和MQ的实时程序队列管理器进行通信的
简单地说MQ的核心部分是一个能够存储消息的服务器及一组能够转发消息的进程分布在多个系统(异地异种平台)上的应用程序依靠这种机制来交换要处理的数据队列管理器作为一个服务器把消息以可靠的方式存储即使机器发生故障重新启动后依然不会丢失其可靠级别与数据库服务器相等队列管理器间通过特别的交换机制保证数据不会因为底层网络的故障而丢失并且能够在多点间接力式地传送
JMS是JEE中的一个接口标准为JAVA程序定义了一种标准的使用消息交换数据的编程方式但JMS本身并不能实现消息的传送一个调用JMS的应用程序发出消息调用后具体的消息传送工作还需要底层的消息中间件来执行传送工作JMS的作用就是使应用程序开发人员不需要关心底层的传送软件的种类同一段程序既可以用MQ传送也可以用其他消息中间件来传送如WEBLOGIC内含的具有消息中间件功能的部件
MQ软件提供一个JAVA软件包里面有JMS类库和一套MQ的类库不熟悉MQI编程方法的程序员可以用JMS比较熟悉MQI编程方法的程序则可以用MQ类库来编程下面的小程序是使用Java实现从队列管理器QM_SERVER中的队列INITQ写入或读出消息
package transfer;
import comibmmq*;
public class SendMSG
{
private MQQueueManager qMgr;//定义一个队列管理器变量
public static void main(String args[])
{
new SendMSG();
}
public SendMSG()
{
MQEnvironmenthostname=;//本地IP
MQEnvironmentchannel=CHANNEL;//用来通信的通道
MQEnvironmentCCSID =;
try{
qMgr=new MQQueueManager(QM_SERVER);//队列管理器名称
int openOptions=MQCMQOO_INPUT_AS_Q_DEF|MQCMQOO_OUTPUT|MQCMQOO_INQUIRE;
MQQueue queue=qMgraccessQueue(INITQopenOptionsnullnullnull);
//建立连接
MQMessage hello=new MQMessage();//要写入队列的消息
try{
helloformat=MQCMQFMT_STRING ;
hellocharacterSet= ;
hellowriteString(这是测试!);
}
catch(javaioIOException ex)
{}finally{};
MQPutMessageOptions pmo=new MQPutMessageOptions();
for (int i=;i<=;i++)//将消息依次写入队列
{
helloexpiry=; //设置消息用不过期
queueput(hello);//将消息放入队列
}
queueclose() ;//关闭队列
qMgrdisconnect() ; //断开连接
}
catch(Exception ex)
{}
finally{};
}
}
程序的运行结果如下图所示
图 程序运行结果界面这个例子仅仅是向队列INITQ写入了条相同的消息当然在实际应用中消息可能是多种多样的如果要传送数据库的内容则可以在写入消息时用一些特殊的符号来将各字段的数据区分开那么在消息读出时也可以根据此特殊的符号来读取数据依据同样的步骤和队列管理器建立连接从队列读取消息关闭队列断开连接可以用Java写出如何从队列中读出消息
MQ有许多显着的优点比如借住在不同的平台上使用相同的应用程序接口它能轻松的实现跨平台通信从而能够使开发人员避开网络的复杂性比如它对消息的处理不依赖于时间在消息创建和发送时不受时间的限制增加了处理的灵活性
总之MQ的特点以及IBM公司在企业应用领域所付出的巨大努力使得它具有极强的生命力现在大量的政府部门金融电信和企业用户使用WebSphere MQ作为企业电子商务的基础平台有理由相信随着政府办公自动化企业信息化的脚步的不断前进WebSphere在中国市场上一定会成为一颗耀眼的明星