摘 要:本文從以下幾個方面簡述了IBM公司的商業通信中間件WebSphere MQ,首先解釋了消息、隊列和隊列管理器的意義,在此基礎上通過圖示闡述了WebSphere MQ在進行通信時所采用的通信機制,以及此通信機制和通信的各應用程序之間的關系。接著通過一個實例來說明在使用Java編寫程序時,如何向隊列寫入消息。最後簡單的介紹了一下MQ的優點及其發展前景。
關鍵詞:通信中間件,隊列,隊列管理器,MQ
WebSphere MQ(以下簡稱MQ)是IBM公司享有盛譽的商業通信中間件。它被世界范圍的許多大型企業廣泛采用。它提供一個具有工業標准、安全、可靠的消息傳輸系統。MQ基本由一個消息傳輸系統和一個應用程序接口組成。應用程序使用MQ的API(消息隊列接口MQI)函數和隊列管理器(MQ運行時刻的程序)進行通信。隊列管理器在工作時,它需要用到對象如隊列和通道。同時,隊列管理器也是一個對象。圖1所示為MQ應用程序在運行時刻的圖示。
圖1 運行時刻的MQ1
消息是一個信息單元,它由兩部分組成:從一個程序發往另外一個程序的應用程序數據以及消息描述符或者消息頭。
消息描述符用來標識消息(message ID),同時它還包括一些控制信息,如消息類型,消息過期的時間,消息優先級等等。
一條消息的最大長度為100MB,默認的最大消息長度為4MB。消息的最大長度依賴於MQ的版本。MQ第五版支持消息的最大長度為100MB。
隊列是一個安全的存儲消息的地方,消息的存儲一般是有順序的。因為消息存放在隊列中,所以應用程序可以以不同的速度、在不同的時間、不同的地點相互獨立的運行。
消息隊列通信是應用程序之間進行通信的一種方式。應用程序在沒有專有連接或者物理連接的情況下,能夠通過向隊列寫入或讀出消息進行通信,也即程序之間不是通過互相調用,而是通過向隊列發送數據來進行通信。在這種通信方式下,應用程序不需要具有並發性。對於異步的消息通信,程序發送方不需要專門等待已發消息的回復,而是可以處理下一個事件。與之相對的是,同步消息通信在處理下一個事件之前必須等待已發消息的回復。對於用戶來說,底層的協議是透明的。用戶只需要考慮會話的程序或數據入口。
MQ應用於客戶機/服務器模式或者分布式系統。應用程序可以工作在一個工作站上,也可以運行在不同平台的不同機器上。應用程序具有很好的移植性,能夠輕松的從一個系統或者平台轉移到另一個系統或者平台。程序的編寫支持多種語言,包括Java。同樣的,隊列也適合許多不同的平台。
因為MQ通過隊列進行通信,所以它可以被看成是使用間接的程序--程序方式通信。程序員可以不指定接收消息的目標程序的名稱,但是可以指定接收消息的隊列的名稱,每一個隊列和一個程序相聯系,一個程序可以有一個或者多個接收隊列,而且可以有多個輸出隊列。輸出隊列包含著很多信息,這些信息可以是用來供服務器處理的,也可以是返還給發送消息的客戶端的回復信息。
使用MQ進行通信時程序員不必擔心目標程序是否可用或是否繁忙,甚至不用考慮目標機器是否正常運行或者是否連接上了。程序員發送消息給目標隊列,而目標隊列是和目標程序相聯系的,目標程序可能目前不可用。不用擔心,MQ能夠解決這種情況,如果需要,它甚至能夠啟動目標程序。
如果目標程序不可用,消息會停留在隊列中,稍後再被處理。隊列可以在發送消息的機器中,也可以在接收消息的機器中,這取決於兩台機器的兩個系統之間是否能夠建立連接。應用程序可以整天運行,也可以采用激發機制,所謂激發,就是指當有一條或數條消息到達隊列時自動啟動某個程序。
圖2 消息和隊列1
圖2說明了兩個應用程序A和B之間是如何進行通信的。可以看到有兩個隊列,各隊列裡面存放著要接收或者發送的消息。
程序和隊列之間的方形圖表示MQI(消息隊列接口API)。程序就是使用MQI來和MQ的實時程序--隊列管理器進行通信的。
簡單地說:MQ的核心部分是一個能夠存儲消息的服務器及一組能夠轉發消息的進程,分布在多個系統(異地、異種平台)上的應用程序依靠這種機制來交換要處理的數據2。隊列管理器作為一個服務器,把消息以可靠的方式存儲,即使機器發生故障重新啟動後依然不會丟失,其可靠級別與數據庫服務器相等。隊列管理器間通過特別的交換機制保證數據不會因為底層網絡的故障而丟失,並且能夠在多點間接力式地傳送。
JMS是J2EE中的一個接口標准,為JAVA程序定義了一種標准的使用消息交換數據的編程方式,但JMS本身並不能實現消息的傳送,一個調用JMS的應用程序發出消息調用後,具體的消息傳送工作還需要底層的消息中間件來執行傳送工作。JMS的作用就是使應用程序開發人員不需要關心底層的傳送軟件的種類,同一段程序,既可以用MQ傳送,也可以用其他消息中間件來傳送,如WEBLOGIC內含的具有消息中間件功能的部件。