熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

基於WebSphere MQ的收發消息程序

2013-11-15 11:41:06  來源: JSP教程 

  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在中國市場上一定會成為一顆耀眼的明星
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19439.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.