.Net環境下操作IBM WebShpere MQ

IBM WebShpere MQ 簡單介紹:

具體的詳細信息大家可以在IBM的網站和網上有許多的學習資料。

IBM MQ是實現了消息隊列的一箇中間件,它可以運行在現在所有流行的平臺上。在我們的項目中主要使用的是AS400和UNIX平臺上。

在IBM MQ中主要分爲以下幾個對象:

 

Queue Manager

隊列管理器

主要負責管理隊列、通道等,類似與Oracle中的Oracle實例的概念,在一臺服務器中可以定義多個Queue Manager。

Queue

隊列

是存放Message的對象,是我們主要操作的對象。類似與Oracle中的表的概念。

Message

消息

實際放入Queue中的消息,該消息可以存儲字符串、Stream等對象。

Channel

通道

是我們的應用以及兩個Queue Manager操作的鏈接對象

Process

過程

 

 

Queue的分類:

Local Queue

本地隊列

主要存儲消息的對象

Remote Queue

遠程隊列

和另外一個Queue Manager通訊的隊列

Mode Queue

模板隊列

建立一個隊列模板,通過這個模板可以建立與模板相同屬性的動態隊列。

Dynamic Queue

動態對了(臨時隊列)

可以在程序中創建和刪除的臨時隊列

 

Channel類型:

在我們介紹中只使用了類型爲SVRCONN的通道。


 

.Net連接Queue Manager的關鍵要素:

.Net的程序需要以下幾個關鍵要素才能連接的一個Queue Manager上。

1、  Address & Port

MQ的服務器地址以及要連接的Queue Manager的監聽端口,默認端口1414。

2、  Queue Manager Name

要連接的Queue Manager的名字,區分大小寫,默認全部大寫。

3、  Channel Name

SVRCONN類型的Channel的名字,需要注意的是該Channel的屬性MCAUSER必須設置爲一個足夠權限的系統用戶,否則不能連接成功。

4、  CCSID

CCSID是Queue Manager的編碼字符集,需要Queue Manager的CCSID與你的.Net操作系統的CCSID互相兼容或者一致才能成功連接。默認情況下UNIX平臺的Queue Manager的CCSID爲819,而簡體中文版的Windows的CCSID爲1381。這兩個編碼字符集是不能兼容的,所以需要調整。

調整有兩種方式:

1)  調整Queue Manager的CCSID,調整成與1381兼容的即可,不一定需要調整成1381

2)  在不能調整Queue Manager時需要配置Windows的環境變量,在Windows的環境變量中增加MQCCSID的環境變量,值需要與Queue Manager的CCSID一致或兼容。

 

在我們介紹的例子中使用環境如下:

 

Server:Sun OS 5.9

Address

192.168.128.115

Port

1414(默認端口)

Queue Manager Name

SGS.MGR

Channel Name

SGS.CHANNEL

 

Queue Manager的屬性如下(注意紅色部分):

Display Queue Manager details.

   DESCR( )                                DEADQ( )

   DEFXMITQ( )                             CHADEXIT( )

   CLWLEXIT( )                             CLWLDATA( )

   REPOS( )                                REPOSNL( )

   COMMANDQ(SYSTEM.ADMIN.COMMAND.QUEUE)    QMNAME(SGS.MGR)

   CRDATE(2007-04-02)                      CRTIME(16.24.23)

   ALTDATE(2007-04-02)                     ALTTIME(16.24.23)

   QMID(SGS.MGR_2007-04-02_16.24.23)       TRIGINT(999999999)

   MAXHANDS(256)                           MAXUMSGS(10000)

   AUTHOREV(DISABLED)                      INHIBTEV(DISABLED)

   LOCALEV(DISABLED)                       REMOTEEV(DISABLED)

   PERFMEV(DISABLED)                       STRSTPEV(ENABLED)

   CHAD(DISABLED)                          CHADEV(DISABLED)

   CLWLLEN(100)                            MAXMSGL(4194304)

   CCSID(819)                              MAXPRTY(9)

   CMDLEVEL(510)                           PLATFORM(UNIX)

   SYNCPT                                  DISTL(YES)

 

Channel的屬性如下(注意紅色部分):

Display Channel details.

   CHANNEL(SGS.CHANNEL)                    CHLTYPE(SVRCONN)

   TRPTYPE(TCP)                            DESCR( )

   SCYEXIT( )                              MAXMSGL(4194304)

   SCYDATA( )                              HBINT(300)

   MCAUSER(mqm)                            ALTDATE(2007-04-02)

   ALTTIME(16.30.23)

   SENDEXIT( )

   RCVEXIT( )

   SENDDATA( )

   RCVDATA( )

 

由於Queue Manager的CCSID使用819,故增加系統的環境變量:

 



環境準備:

1、  安裝IBM WebSphere MQ Client for Windows。(MQ客戶端)

2、  安裝WebSphere MQ classes for Microsoft .NET.msi。(.Net插件)

3、  在你的.Net項目中引用 amqmdnet.dll,該dll在.Net插件安裝目錄中可以找到。

 

開始編寫代碼:

鏈接MQManager 及遠程隊列寫入信息:

 public class ZYTaskMQDAC
    {
        private MQQueueManager mqQMgr = null;
        private MQQueue mqueue = null;

        public ZYTaskMQDAC()
        {
            CreateCon();
            CreateQueue();
        }

        /// <summary>
        /// 創建隊列管理器
        /// </summary>
        public void CreateCon()
        {
            if (this.mqQMgr == null)
            {
                try
                {
                    string hostname =  ConfigurationManager.AppSettings["HostName"];                         //服務器的IP
                    string channel =ConfigurationManager.AppSettings["Channel"] ;                      //服務器通道
                    string qManager = ConfigurationManager.AppSettings["MQManaager"];                //隊列管理器名稱
                    string userName =ConfigurationManager.AppSettings["UserName"] ;                     //用戶名
                    string pword =ConfigurationManager.AppSettings["Password"] ;                      //用戶密
                    int mQPort=Convert.ToInt32(ConfigurationManager.AppSettings["MQPort"]);          //MQ端口
                    //初始化環境變量
                    MQEnvironment.Hostname = hostname;
                    MQEnvironment.Channel = channel;
                    MQEnvironment.Port = mQPort;
                    MQEnvironment.UserId = userName;
                    MQEnvironment.Password = pword;

                    //構造隊列管理器
                    this.mqQMgr = new MQQueueManager(qManager);
                }
                catch (MQException ex)
                {
                    //日子記錄創建列管理器 失敗
                    ExceptionService.Current.Handle(ex);
                    this.mqQMgr = null;
                }
            }
        }


        /// <summary>
        /// 創建隊列
        /// </summary>
        private void CreateQueue()
        {
           string sendQueue=ConfigurationManager.AppSettings["SendQueue"]; //發送隊列名稱
           try
            {
                if (this.mqQMgr == null)
                    return;

                //通過MQ管理創建隊列實例
                int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE;
                mqueue = this.mqQMgr.AccessQueue(sendQueue, openOptions);
            }
            catch (MQException ex)
            {
                //日誌記錄 鏈接隊列管理失敗!
                ExceptionService.Current.Handle(ex);
            }
        }

        /// <summary>
        /// 寫入隊列信息
        /// </summary>
        /// <param name="_strMsg"></param>
        public void PutMsgToMQ(string _strMsg)
        {
            MQMessage mqmsg = null;
            try
            {
                //創建消息操作實例
                MQPutMessageOptions pmo = new MQPutMessageOptions();

                //創建消息實例
                mqmsg = new MQMessage();

                mqmsg.CharacterSet = 1208;       //設置消息編碼爲UTF-8
                mqmsg.WriteString(_strMsg);
                mqmsg.Format = MQC.MQFMT_STRING; //制定消息格式爲String

                //發送消息
                mqueue.Put(mqmsg, pmo);

            }
            catch (MQException ex)
            {
                //日誌記錄 發送消息失敗
                ExceptionService.Current.Handle(ex);
            }
        }

        /// <summary>
        /// 關閉隊列 釋放連接
        /// </summary>
        public void CloseMQ()
        {
            if(mqueue!=null)
                mqueue.Close();
            if(mqQMgr!=null)
            {
                mqQMgr.Disconnect();
                mqQMgr = null;
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章