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

使用JMS接口接入WebSphere MQ消息

2013-11-15 11:49:17  來源: JSP教程 

  在你的應用程序中利用IBM WebSphere MQ消息中間件提供Java消息服務開放接口

  IBM WebSphere MQ(WMQ)是一套面向消息的中間件(messageoriented middlewareMOM)通過使用消息和隊列簡化應用程序之間的通信WMQ支持點到點的和發布/訂閱消息支持多種平台包括WindowsAIXHPUX和Sun Solaris它特別適合目前的異構計算環境

  對於Java開發者而言WMQ為Java應用程序提供了兩種接口

  為Java提供MQ基礎類 一個基於WMQ本地接口的Java接口

  MQ JMS Java消息服務(Java Messaging Service JMS)接口的實現

  JMS通過開啟Java應用程序發送和接收消息擴展了Java的互操作性JMS應用程序可以使用點到點或發布/訂閱模式進行消息交換

  本文描述的是使用WMQ和JMS進行開發的過程重心集中在點到點消息通過下面幾步教你如何使用Java類編寫JMS接口

  創建WMQ對象

  創建JMS管理對象

  解釋JMS代碼

  運行一個實例類發送消息和從WMQ接收消息

   WMQ安裝

  本文使用的是winxp上的MQ 版本 (可以從下載試用版)在windows上的安裝是非常簡單的一路默認就可以完成安裝

  如果你還沒有使用過WMQ也不要擔心你可以使用基於Eclipse的WebSphere MQ管理器它是一個簡單的用於管理WMQ的圖形工具

  創建MQ對象隊列管理器和隊列

  隊列是用來存儲 target=_blank>存儲消息的直到應用程序處理完畢才釋放隊列管理器擁有並管理隊列要創建一個隊列管理器和隊列按以下步驟啟動WebSphere MQ管理器開始?所有程序? IBM WebSphere MQ ? WebSphere MQ Explorer顯示了啟動WebSphere MQ管理器時的樣子
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 WebSphere MQ 管理器

  在MQ管理器中執行下列操作創建一個隊列管理器

  在導航視圖下右擊隊列管理器選擇新建隊列管理器啟動創建隊列管理器向導

  在第一步中輸入隊列管理器的名字TestMQ點擊下一步如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 創建隊列管理器第一步輸入隊列管理器名稱

  在第二步和第三步都點擊下一步進入第四步確定選中了創建一個TCP/IP監聽器然後輸入一個未使用的端口號點擊完成如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 創建隊列管理器第四步檢查隊列管理器的監聽器端口號

  接下來創建兩個隊列INQUEUE 和 OUTQUEUE你就可以將消息寫入INQUEUE從OUTQUEUE讀取消息

  在TestMQ下右擊隊列?新建?本地隊列啟動新建本地隊列向導

  在名稱區域輸入INQUEUE點擊完成如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 創建隊列向導輸入隊列名稱其它屬性值保留默認值

  重復上面的步驟創建好隊列OUTQUEUE

  創建JMS管理對象

  JMS定義了一個通用的接口來發送和接收消息只要與之通信的程序兼容JMS即可點到點的JMS接口是

   javaxjmsQueueConnection 這個接口提供一個到JMS提供程序的連接用於創建會話對象

  javaxjmsQueueSession 這個接口為產生和消耗消息提供上下文呢包括創建QueueSender和QueueReceiver的方法

   javaxjmsQueueSender 這個接口用於向隊列發送消息javaxjmsQueueReceiver用於從隊列接收消息

  為了讓你的代碼可以在不同的消息提供程序間有良好的移植性你必須在你的應用程序中使用javaxjms中的標准JMS接口所有特定廠家的信息都封裝在javaxjmsQueueConnectionFactory 和 javaxjmsQueue中這些管理對象可以使用廠家提供管理工具進行構建存儲在JNDI命名空間中JMS應用程序可以從命名空間中檢索這些對象這時就不需要知道是哪個廠家提供的了

  按照下面的步驟使用Websphere MQ管理器創建管理對象存儲在基於文件的目錄下

  在JMS管理對象上點擊右鍵?添加初始上下文

  在屏幕

  為JNDI存儲在哪裡選擇文件系統

  在關聯目錄處輸入C:\JNDIDirectory(前提是這個目錄已經存在)

  注意工廠類和提供程序URL因為你將會在Java代碼中使用到(如圖所示)
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 添加初始上下文向導你將在樣例類中使用工廠類和提供程序URL

  你的管理器現在應該如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 添加初始上下文後的MQ管理器你可以在MQ管理器中輕易地創建JMS管理對象

  在新的初始上下文中創建一個連接工廠

  在連接工廠上點擊右鍵?新建?連接工廠在第一個屏幕上在名稱區域輸入TestQM_QCF點擊下一步在JNDI查找中你就使用TestQM_QCF了

  將類型設置為隊列連接工廠點擊下一步如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 新建連接工廠向導用於點對點消息的隊列連接工廠

  保持傳送類型為匯集點擊下一步當WMQ和應用程序在同一機器上時使用匯集傳輸

  在下一頁面點擊下一步(無需修改設置)

  在最後一頁選擇連接標簽點擊選擇按鈕選擇TestQM作為基礎隊列管理器如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 新建連接工廠向導連接工廠被包裝為TestMQ

  點擊完成

  接下來創建目的地對應WMQ消息的JMS管理對象

  在目的地上點擊右鍵?選擇新建?目的地

  在第一頁上在名字區域輸入INInputTestQueue作為名字確保類型設置為隊列了點擊下一步如圖所示
<fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 新建目的地向導使用InputTestQueue查找INQUEUE

  第二頁保持默認設置不變點擊下一步

  在最後一頁

  在隊列管理器區域點擊選擇按鈕選擇TestQM

  在隊列區域點擊選擇按鈕選擇INQUEUE

  點擊完成

  重復上述步驟創建另一個目的地OutputTestQueue它對應OUTQUEUE

  理解示例類

  如果你編寫過JMS應用程序就很容易理解JNDIUtil 和 Tester示例類(從_JMSSource&Classeszip下載Java源文件和編譯好的類)你創建的JMS管理對象隱藏了所有廠家專利實現

  JNDIUtil類

  JNDIUtil包括使用名字通過JNDI查找檢索對象的方法參考清單你可以使用這個類中的方法檢索你在MQ管理器中定義的JMS對象的引用情況

  清單 JNDIUtiljava





Code highlighting produced by Actipro CodeHighlighter (freeware)


>package devxarticlesmqjms;

  // JMS 類

  import javaxjmsJMSException;

  import javaxjmsQueue;

  import javaxjmsQueueConnectionFactory;

  // JNDI 類

  import javaxnamingInitialContext;

  import javaxnamingContext;

  import javaxnamingNamingException;

  // 標准 Java類

  import javautilHashtable;

  /**

  *

  * A wrapper class for JNDI calls

  *

  */

  public class JNDIUtil

  {

  private Context context;

  public JNDIUtil(String icf String url) throws JMSException NamingException

  {

  Hashtable environment = new Hashtable();

  environmentput(ContextINITIAL_CONTEXT_FACTORY icf );

  environmentput(ContextPROVIDER_URL url);

  context= new InitialContext( environment );

  }

  /**

  *

  * @param ObjName Object Name to be retrieved

  * @return Retrieved Object

  * @throws NamingException

  */

  private Object getObjectByName(String ObjName) throws NamingException

  {

  return contextlookup( ObjName );

  }

  /**

  * A convenience method that returns QueueConnectionFactory objects (no casting required)

  * @param factoryName QueueConnectionFactory JNDI name

  * @return QueueConnectionFactory object

  * @throws NamingException

  */

  public QueueConnectionFactory getQueueConnectionFactory(String factoryName) throws NamingException

  {

  return (QueueConnectionFactory) getObjectByName(factoryName);

  }

  /**

  * A convenience method that returns Queue objects (no casting required)

  * @param queueName

  * @return

  * @throws NamingException

  */

  public Queue getQueue(String queueName) throws NamingException

  {

  return (Queue) getObjectByName(queueName);

  }

  }

  Tester類

  Tester類向OUTQUEUE中寫入消息從INQUEUE中讀取消息參考清單

  清單 Testerjava





Code highlighting produced by Actipro CodeHighlighter (freeware)


> package devxarticlesmqjms;

  //JMS 類

  import javaxjmsQueue;

  import javaxjmsQueueSession;

  import javaxjmsQueueConnection;

  import javaxjmsQueueConnectionFactory;

  import javaxjmsJMSException;

  import javaxjmsSession;

  import javaxjmsQueueSender;

  import javaxjmsQueueReceiver;

  import javaxjmsTextMessage;

  import javaxjmsMessage;

  //JNDI 類

  import javaxnamingNamingException;

  //標准 Java 類

  /**

  *

  * A class to test JMS with IBM MQ

  *

  */

  public class Tester

  {

  public static String icf = comsunjndifscontextRefFSContextFactory;

  public static String url = file:/C:/JNDIDirectory;

  public static void main(String[] vars) throws JMSException NamingException

  {

  QueueSession session = null;

  QueueConnection connection = null;

  QueueConnectionFactory factory = null;

  QueueSender queueSender = null;

  QueueReceiver queueReceiver= null;

  Queue oQueue = null; // 消息發送到的隊列

  Queue iQueue = null; // 接收消息的隊列

  try

  {

  JNDIUtil jndiUtil= new JNDIUtil(icfurl);

  factory= jndiUtilgetQueueConnectionFactory(TestQM_QCF);

  connection = factorycreateQueueConnection();

  // 啟動(或重新啟動)入站消息的連接地址如果沒有這個調用消息不會被接收

  connectionstart();

  //表示一個非相互操作會話

  boolean transacted = false;

  session = connectioncreateQueueSession( transacted SessionAUTO_ACKNOWLEDGE);

  oQueue= jndiUtilgetQueue(OutputTestQueue);

  queueSender = sessioncreateSender(oQueue);

  TextMessage oMsg = sessioncreateTextMessage();

  oMsgsetText();

  // 你還可以設置其他消息屬性

  queueSendersend(oMsg);

  iQueue= jndiUtilgetQueue(InputTestQueue);

  queueReceiver = sessioncreateReceiver(iQueue);

  Message iMsg = queueReceiverreceive();

  if ( iMsg != null )

  Systemoutprintln( ((TextMessage)iMsg)getText() );

  else

  Systemoutprintln( No messages in queue );

  }

  finally

  {

  //總是釋放資源

  if ( queueReceiver!= null )

  queueReceiverclose();

  if ( queueSender!= null )

  queueSenderclose();

  if ( session!= null )

  sessionclose();

  if ( connection!= null )

  {

  connectionclose();

  }

  }

  }

  }

  開始點是連接工廠查找這個工廠用於創建一個連接





Code highlighting produced by Actipro CodeHighlighter (freeware)


>factory= jndiUtilgetQueueConnectionFactory(TestQM_QCF);

  connection = factorycreateQueueConnection();

  連接對象用於創建一個會話





Code highlighting produced by Actipro CodeHighlighter (freeware)


> session = connectioncreateQueueSession( transacted SessionAUTO_ACKNOWLEDGE);

  要將消息寫入INQUEUE queue查找前面創建的目的地對象OutputTestQueue





Code highlighting produced by Actipro CodeHighlighter (freeware)


>oQueue= jndiUtilgetQueue(OutputTestQueue);

  最後創建一個QueueSender對象將消息寫入隊列





Code highlighting produced by Actipro CodeHighlighter (freeware)


>queueSender = sessioncreateSender(oQueue);
TextMessage oMsg = sessioncreateTextMessage();
oMsgsetText();
queueSendersend(oMsg);

  從OUTQUEUE讀取消息的過程相同但使用的是QueueReceiver

  編譯運行示例類

  當你安裝WMQ時會自動將編譯和運行示例類需要的jar文件添加到CLASSPATH環境變量中需要的jar文件位於C:\Program Files\IBM\WebSphere MQ\Java\lib包括JMS和JNDI需要的jar

  在運行Tester類之前使用MQ管理器向INQUEUE增加一條測試消息

  在 INQUEUE上點擊右鍵選擇放入測試消息

  輸入任意文本點擊放入消息

  如果你還沒有在INQUEUE隊列中放入過消息Tester類會顯示隊列中無消息

  要運行Tester類將Testerclass 和 JNDIUtilclass添加到CLASSPATH然後在命令提示符輸入





Code highlighting produced by Actipro CodeHighlighter (freeware)


> java devxarticlesmqjmsTester

  應用程序向OUTQUEUE寫入一條消息並顯示從INQUEUE檢索到的消息要檢查發送到OUTQUEUE中的消息進入MQ管理器在OUTQUEUE上點擊右鍵?選擇浏覽消息即可

  企業中的Java和WMQ MOM

  在大型企業環境下可以充分利用WMQ的性能和穩定性優勢只要你的代碼遵循Java標准接口你就可以受益


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19679.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.