隨筆 - 100  文章 - 50  trackbacks - 0
          <2012年3月>
          26272829123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          這份程序的原始文檔是來自于互聯(lián)網(wǎng),不過不知道作者是誰,在些先謝了,我增加了個(gè)人的理解在里面,增加注釋,這樣便于閱讀與理解。

          該程序?qū)崿F(xiàn)了發(fā)送消息與讀取消息的功能,見其中的send***與get***方法。這只適合于測試,因?yàn)榄h(huán)境中的程序還需要對(duì)此有稍微的更改,在真實(shí)的環(huán)境中肯定是在while(true){...}的無限循環(huán)中去調(diào)用其中的get方法,如果有值,那就執(zhí)行對(duì)消息的處理操作,如果沒有值就繼續(xù)循環(huán),在get方法中有等待的時(shí)間。

          這個(gè)程序就其本身來說還是比較理解的:

          1、首先設(shè)置一些相關(guān)的環(huán)境變量

          2、再連接隊(duì)列管理器

          3、再次操作隊(duì)列管理器中的指定隊(duì)列

          4、往指定隊(duì)列中發(fā)消息或者是從指定對(duì)列中取消息

          5、關(guān)閉隊(duì)列

          如果不知道如何在MQ資源管理器中配置遠(yuǎn)程隊(duì)列及通過遠(yuǎn)程隊(duì)列往遠(yuǎn)程的MQ發(fā)送消息,請參見文章:

          http://blog.csdn.net/fenglibing/archive/2009/05/08/4160639.aspx

          真實(shí)環(huán)境中的MQ,個(gè)人覺得至少都應(yīng)該有兩個(gè)本地隊(duì)列加一個(gè)遠(yuǎn)程隊(duì)列,因?yàn)橄⒌慕换タ隙ㄊ窍嗷サ模惺障?,肯定也有發(fā)消息。一個(gè)本地隊(duì)列用于接收外部發(fā)過來的消息,用法為正常;另一個(gè)本地隊(duì)例用于傳輸,用于做于遠(yuǎn)程隊(duì)例的傳輸隊(duì)列,將消息發(fā)送給遠(yuǎn)程主機(jī)的本地隊(duì)列。要使消息能夠成功的傳送到遠(yuǎn)程隊(duì)列,還需要配置通道,通常中需要指定遠(yuǎn)程通道的IP地址及端口、本地傳輸隊(duì)例的名稱、以及本地的通信地址,這樣才能夠往遠(yuǎn)程主機(jī)發(fā)送消息。

          1. /** 
          2.  * @author Fenglb E-mail:56553655@163.com 
          3.  * @version 創(chuàng)建時(shí)間:2009-4-30 下午04:13:38 
          4.  * 類說明 
          5.  */  
          6. import java.io.IOException;  
          7. import com.ibm.mq.MQC;  
          8. import com.ibm.mq.MQEnvironment;  
          9. import com.ibm.mq.MQException;  
          10. import com.ibm.mq.MQGetMessageOptions;  
          11. import com.ibm.mq.MQMessage;  
          12. import com.ibm.mq.MQPutMessageOptions;  
          13. import com.ibm.mq.MQQueue;  
          14. import com.ibm.mq.MQQueueManager;  
          15.   
          16. public class MessageByMQ{  
          17.      //定義隊(duì)列管理器和隊(duì)列的名稱   
          18.      private static String qmName;   
          19.      private static String qName;  
          20.      private static MQQueueManager qMgr;  
          21.      static{  
          22.          //設(shè)置環(huán)境:   
          23.          //MQEnvironment中包含控制MQQueueManager對(duì)象中的環(huán)境的構(gòu)成的靜態(tài)變量,MQEnvironment的值的設(shè)定會(huì)在MQQueueManager的構(gòu)造函數(shù)加載的時(shí)候起作用,   
          24.          //因此必須在建立MQQueueManager對(duì)象之前設(shè)定MQEnvironment中的值.   
          25.          MQEnvironment.hostname="10.24.1.180";          //MQ服務(wù)器的IP地址         
          26.          MQEnvironment.channel="S_FENGLB";              //服務(wù)器連接的通道   
          27.          MQEnvironment.CCSID=1381;                      //服務(wù)器MQ服務(wù)使用的編碼1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID)   
          28.          MQEnvironment.port=1414;                       //MQ端口   
          29.          qmName = "QM_FENGLB";                          //MQ的隊(duì)列管理器名稱   
          30.          qName = "testQ";                               //MQ遠(yuǎn)程隊(duì)列的名稱   
          31.          try {  
          32.              //定義并初始化隊(duì)列管理器對(duì)象并連接    
          33.              //MQQueueManager可以被多線程共享,但是從MQ獲取信息的時(shí)候是同步的,任何時(shí)候只有一個(gè)線程可以和MQ通信。   
          34.             qMgr = new MQQueueManager(qmName);  
          35.         } catch (MQException e) {  
          36.             // TODO Auto-generated catch block   
          37.             System.out.println("初使化MQ出錯(cuò)");  
          38.             e.printStackTrace();  
          39.         }   
          40.      }  
          41.      /** 
          42.       * 往MQ發(fā)送消息 
          43.       * @param message 
          44.       * @return 
          45.       */  
          46.      public static int sendMessage(String message){  
          47.          int result=0;  
          48.          try{     
          49.              //設(shè)置將要連接的隊(duì)列屬性   
          50.              // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface    
          51.              //(except for completion code constants and error code constants).   
          52.              //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.   
          53.              //MQOO_OUTPUT:Open the queue to put messages.   
          54.              /*目標(biāo)為遠(yuǎn)程隊(duì)列,所有這里不可以用MQOO_INPUT_AS_Q_DEF屬性*/  
          55.              //int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;   
          56.              /*以下選項(xiàng)可適合遠(yuǎn)程隊(duì)列與本地隊(duì)列*/  
          57.              int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;  
          58.              //連接隊(duì)列    
          59.              //MQQueue provides inquire, set, put and get operations for WebSphere MQ queues.    
          60.              //The inquire and set capabilities are inherited from MQManagedObject.    
          61.              /*關(guān)閉了就重新打開*/  
          62.             if(qMgr==null || !qMgr.isConnected()){  
          63.                 qMgr = new MQQueueManager(qmName);  
          64.             }  
          65.              MQQueue queue = qMgr.accessQueue(qName, openOptions);            
          66.              //定義一個(gè)簡單的消息   
          67.              MQMessage putMessage = new MQMessage();   
          68.              //將數(shù)據(jù)放入消息緩沖區(qū)   
          69.              putMessage.writeUTF(message);    
          70.              //設(shè)置寫入消息的屬性(默認(rèn)屬性)   
          71.              MQPutMessageOptions pmo = new MQPutMessageOptions();             
          72.              //將消息寫入隊(duì)列    
          73.              queue.put(putMessage,pmo);   
          74.              queue.close();  
          75.          }catch (MQException ex) {   
          76.              System.out.println("A WebSphere MQ error occurred : Completion code "   
          77.              + ex.completionCode + " Reason code " + ex.reasonCode);   
          78.              ex.printStackTrace();  
          79.          }catch (IOException ex) {   
          80.              System.out.println("An error occurred whilst writing to the message buffer: " + ex);   
          81.          }catch(Exception ex){  
          82.              ex.printStackTrace();  
          83.          }finally{  
          84.              try {  
          85.                 qMgr.disconnect();  
          86.             } catch (MQException e) {  
          87.                 e.printStackTrace();  
          88.             }  
          89.           }  
          90.          return result;  
          91.      }  
          92.      /** 
          93.       * 從隊(duì)列中去獲取消息,如果隊(duì)列中沒有消息,就會(huì)發(fā)生異常,不過沒有關(guān)系,有TRY...CATCH,如果是第三方程序調(diào)用方法,如果無返回則說明無消息 
          94.       * 第三方可以將該方法放于一個(gè)無限循環(huán)的while(true){...}之中,不需要設(shè)置等待,因?yàn)樵谠摲椒▋?nèi)部在沒有消息的時(shí)候會(huì)自動(dòng)等待。 
          95.       * @return 
          96.       */  
          97.      public static String getMessage(){  
          98.          String message=null;  
          99.          try{              
          100.              //設(shè)置將要連接的隊(duì)列屬性   
          101.              // Note. The MQC interface defines all the constants used by the WebSphere MQ Java programming interface    
          102.              //(except for completion code constants and error code constants).   
          103.              //MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the queue-defined default.   
          104.              //MQOO_OUTPUT:Open the queue to put messages.   
          105.              int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;  
          106.              MQMessage retrieve = new MQMessage();  
          107.              //設(shè)置取出消息的屬性(默認(rèn)屬性)   
          108.              //Set the put message options.(設(shè)置放置消息選項(xiàng))    
          109.              MQGetMessageOptions gmo = new MQGetMessageOptions();   
          110.              gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;//Get messages under sync point control(在同步點(diǎn)控制下獲取消息)    
          111.              gmo.options = gmo.options + MQC.MQGMO_WAIT;  // Wait if no messages on the Queue(如果在隊(duì)列上沒有消息則等待)    
          112.              gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;// Fail if Qeue Manager Quiescing(如果隊(duì)列管理器停頓則失?。?nbsp;   
          113.              gmo.waitInterval = 1000 ;  // Sets the time limit for the wait.(設(shè)置等待的毫秒時(shí)間限制)    
          114.              /*關(guān)閉了就重新打開*/  
          115.             if(qMgr==null || !qMgr.isConnected()){  
          116.                 qMgr = new MQQueueManager(qmName);  
          117.             }  
          118.              MQQueue queue = qMgr.accessQueue(qName, openOptions);   
          119.              // 從隊(duì)列中取出消息   
          120.              queue.get(retrieve, gmo);  
          121.              message = retrieve.readUTF();    
          122.              System.out.println("The message is: " + message);   
          123.              queue.close();  
          124.          }catch (MQException ex) {   
          125.              System.out.println("A WebSphere MQ error occurred : Completion code "   
          126.              + ex.completionCode + " Reason code " + ex.reasonCode);   
          127.          }catch (IOException ex) {   
          128.              System.out.println("An error occurred whilst writing to the message buffer: " + ex);   
          129.          }catch(Exception ex){  
          130.              ex.printStackTrace();  
          131.          }finally{  
          132.              try {  
          133.                 qMgr.disconnect();  
          134.             } catch (MQException e) {  
          135.                 e.printStackTrace();  
          136.             }  
          137.          }  
          138.          return message;  
          139.      }  
          140.      public static void main(String args[]) {  
          141.          /*下面兩個(gè)方法可同時(shí)使用,也可以單獨(dú)使用*/  
          142.          sendMessage("this is a test");  
          143.          //getMessage();   
          144.      }  
          145. }  
          posted on 2012-03-04 23:15 fly 閱讀(3998) 評(píng)論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 荆门市| 天门市| 锦州市| 驻马店市| 沈丘县| 如皋市| 红河县| 徐汇区| 辽阳县| 高淳县| 民和| 宣武区| 五峰| 武汉市| 公主岭市| 石林| 海晏县| 封丘县| 乌拉特后旗| 合川市| 大田县| 房产| 梧州市| 长阳| 牡丹江市| 类乌齐县| 繁昌县| 田林县| 科技| 大名县| 乐安县| 宝兴县| 巴塘县| 曲麻莱县| 广宗县| 托里县| 西城区| 吐鲁番市| 噶尔县| 洪江市| 九江县|