• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    IBM MQSeries使用指南

    發布: 2008-2-20 16:54 | 作者: 賴壽生 | 來源: 不詳 | 查看: 88次 | 進入軟件測試論壇討論

    領測軟件測試網 隨著計算機網絡和分布式應用的不斷發展,遠程消息傳遞越來越成為應用系統中不可缺少的組成部分。商業消息中間件的出現保證了消息傳輸的可靠性,高效率和安全性,同時也減少了系統的開發周期。目前應用最多的消息中間件產品為 IBM MQSeries 。本文就針對 MQ 的基本操作與配置進行詳細的闡述,希望對讀者有所幫助。

        一. MQ 基本操作

        MQ 中有幾個很重要的組件:隊列管理器( QueueManager )、隊列( Queue )和通道( Channel )。其基本的操作方法如下:

        創建隊列管理器

        crtmqm –q QMgrName

        -q 是指創建缺省的隊列管理器

        刪除隊列管理器

        dltmqm QmgrName

        啟動隊列管理器

        strmqm QmgrName

        如果是啟動默認的隊列管理器,可以不帶其名字

        停止隊列管理器

        endmqm QmgrName 受控停止

        endmqm – i QmgrName 立即停止

        endmqm – p QmgrName 強制停止

        顯示隊列管理器

        dspmq –m QmgrName

        運行 MQSeries 命令

        runmqsc QmgrName

        如果是默認隊列管理器,可以不帶其名字

        往隊列中放消息

        amqsput QName QmgrName

        如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字

        從隊列中取出消息

        amqsget QName QmgrName

        如果隊列是默認隊列管理器中的隊列,可以不帶其隊列管理器的名字

        啟動通道

        runmqchl –c ChlName –m QmgrName

        啟動偵聽

        runmqlsr –t TYPE –p PORT –m QMgrName

        停止偵聽

        endmqlsr -m QmgrName

        MQSeries 命令

        定義死信隊列

        DEFINE QLOCAL ( QNAME ) DEFPSIST ( YES ) REPLACE

        設定隊列管理器的死信隊列

        ALTER QMGR DEADQ ( QNAME )

        定義本地隊列

        DEFINE QL ( QNAME ) REPLACE

        定義別名隊列

        DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)

        遠程隊列定義

        DEFINE QREMOTE ( QRNAME ) +

        RNAME ( AAA ) RQMNAME ( QMGRNAME ) +

        XMITQ ( QTNAME )

        定義模型隊列

        DEFINE QMODEL ( QNAME ) DEFTYPE ( TEMPDYN )

        定義本地傳輸隊列

        DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +

        INITQ ( SYSTEM.CHANNEL.INITQ ) +

        PROCESS(PROCESSNAME) REPLACE

        創建進程定義

        DEFINE PROCESS ( PRONAME ) +

        DESCR (‘ STRING ') +

        APPLTYPE ( WINDOWSNT ) +

        APPLICID (' runmqchl -c SDR_TEST -m QM_ TEST ')

        其中 APPLTYPE 的值可以是: CICS 、 UNIX 、 WINDOWS 、 WINDOWSNT 等

        創建發送方通道

        DEFINE CHANNEL ( SDRNAME ) CHLTYPE ( SDR ) +

        CONNAME (‘ 100.100.100.215(1418) ') XMITQ ( QTNAME ) REPLACE

        其中 CHLTYPE 可以是: SDR 、 SVR 、 RCVR 、 RQSTR 、 CLNTCONN 、 SVRCONN 、 CLUSSDR 和 CLUSRCVR 。

        創建接收方通道

        DEFINE CHANNEL ( SDR_ TEST ) CHLTYPE ( RCVR ) REPLACE

        創建服務器連接通道

        DEFINE CHANNEL ( SVRCONNNAME ) CHLTYPE ( SVRCONN ) REPLACE

        顯示隊列的所有屬性

        DISPLAY QUEUE ( QNAME ) [ALL]

        顯示隊列的所選屬性

        DISPLAY QUEUE ( QNAME ) DESCR GET PUT

        DISPLAY QUEUE ( QNAME ) MAXDEPTH CURDEPTH

        顯示隊列管理器的所有屬性

        DISPLAY QMGR [ALL]

        顯示進程定義

        DISPLAY PROCESS ( PRONAME )

        更改屬性

        ALTER QMGR DESCR (‘ NEW DESCRIPTION ')

        ALTER QLOCAL ( QNAME ) PUT ( DISABLED )

        ALTER QALIAS ( QNAME ) TARGQ ( TARGQNAME )

        刪除隊列

        DELETE QLOCAL ( QNAME )

        DELETE QREMOTE ( QRNAME )

        清除隊列中的所有消息

        CLEAR QLOCAL ( QNAME )

        二.配置一個能夠通信的遠程連接

        以上講述了 MQ 的基本命令操作,但只知道這些是沒有實際意義的。 MQ 的最終目的是實現遠程通信,所以下面就以一個具體的例子來說明如何實現遠程連接。這個例子的目的是建立可以實現消息傳遞的一對 MQ 服務器,它們分別基于 NT 和 UNIX 平臺。

        首先在 NT 端建一隊列管理器

        crtmqm –q QM_NT

        啟動隊列管理器

        strmqm QM_NT

        運行 MQ 控制臺命令

        runmqsc QM_NT

        創建死信隊列

        DEFINE QL(NT.DEADQ) DEFPSIST(YES) REPLACE

        更改隊列管理器屬性,設置其死信隊列

        ALTER QMGR DEADQ ( NT.DEADQ )

        創建進程定義

        DEFINE PROCESS ( P_NT ) +

        APPLTYPE ( WINDOWSNT ) +

        APPLICID (' runmqchl -c SDR_NT -m QM_NT ')

        創建本地傳輸隊列

        DEFINE QL(QT_NT) USAGE(XMITQ) DEFPSIST(YES) +

        INITQ ( SYSTEM.CHANNEL.INITQ ) +

        PROCESS(P_NT) REPLACE

        創建遠程隊列定義,對應于 UNIX 機器上的本地隊列 Q_UNIX ,傳輸隊列為 QT_NT

        DEFINE QREMOTE ( QR_NT ) +

        RNAME ( Q_UNIX ) RQMNAME ( QM_UNIX ) +

        XMITQ ( QT_NT )

        創建發送方通道,其傳輸隊列為 QT_NT ,遠程主機地址為 10.10.10.2 ,偵聽端口為 1414

        DEFINE CHANNEL ( SDR_NT ) CHLTYPE ( SDR ) +

        CONNAME (‘ 10.10.10.2(1414) ') XMITQ ( QT_NT ) REPLACE

        創建服務器連接通道

        DEFINE CHANNEL ( S_NT ) CHLTYPE ( SVRCONN ) REPLACE

        在 UNIX 端創建隊列管理器

        crtmqm –q QM_UNIX

        啟動隊列管理器

        strmqm QM_UNIX

        添加偵聽程序

        修改 /etc/services 文件,加入一行:

        MQSeries 1414/tcp #MQSeries channel listener

        修改 /etc/inetd.conf 文件,加入一行(啟動偵聽程序)

        MQSeries stream tcp nowait mqm /usr/lpp/mqm/bin/amqcrsta amqcrsta –m QM_UNIX

        運行以下命令,以使修改起作用

        refresh –s inetd

        運行 MQ 控制臺命令

        runmqsc QM_UNIX

        創建死信隊列

        DEFINE QL(UNIX.DEADQ) DEFPSIST(YES) REPLACE

        更改隊列管理器屬性,設置其死信隊列

        ALTER QMGR DEADQ ( UNIX.DEADQ )

        創建接收方通道,其名字必須與遠程發送方相同

        DEFINE CHANNEL ( SDR_NT ) CHLTYPE ( RCVR ) REPLACE

        創建本地隊列

        DEFINE QL ( Q_UNIX ) DEFPSIST(YES) REPLACE

        創建服務器連接通道

        DEFINE CHANNEL ( S_UNIX ) CHLTYPE ( SVRCONN ) REPLACE

        經過以上操作之后,遠程連接的配置工作完成。接下來需要驗證配置是否正確。

        在 NT 端啟動發送方通道

        runmqchl – c SDR_NT – m QM_NT 或 start chl(SDR_NT)

        從 NT 端發送消息到 UNIX 端

        amqsput QR_NT QM_NT

        在 UNIX 端接收消息

        /usr/mqm/samp/bin/amqsget Q_UNIX QM_UNIX

        若能收到消息,說明配置成功。

        另,在 NT 下一般情況下在建立隊列管理器時會自動建立偵聽器,啟動隊列管理器時則會自動啟動偵聽程序。當然也可以手動配置偵聽程序。

        修改 \winnt\system32\drivers\etc\services 文件,在文件中加入一行:

        MQSeries 1414/tcp #MQSeries channel listener

        啟動偵聽程序

        runmqlsr –t tcp –p 1414 –m QM_NT

        以上說明了怎樣建立簡單的單向傳輸網絡。消息從 NT 端傳送到 UNIX 端。建立從 UNIX 端到 NT 端的遠程連接和以上相仿,要建立雙向的傳輸網絡也是同樣的道理。

        三.配置 JNDI

        用 JMS 實現消息的發送和接收時,經常會用到 JNDI 。因為 JNDI 這種方式比較靈活,對于編程也比較簡單。

        在安裝了 MQSeries Client for Java 之后,在 \java\bin 目錄下找到 JMSAdmin.config 文件。該文件主要用來說明 Context 的存儲方式及存儲地址,對應于文件中的兩個參數 INITIAL_CONTEXT_FACTORY 和 PROVIDER_URL 。典型的 JMSAdmin.config 文件內容如下:

        #INITIAL_CONTEXT_FACTORY=com.sun.jndi.ldap.LdapCtxFactory

        INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory

        #INITIAL_CONTEXT_FACTORY=com.ibm.ejs.ns.jndi.CNInitialContextFactory

        #

        #PROVIDER_URL=ldap://polaris/o=ibm,c=us

        PROVIDER_URL=file:/d:/temp

        #PROVIDER_URL=iiop://localhost/

        #

        SECURITY_AUTHENTICATION=none

        INITIAL_CONTEXT_FACTORY 表示 JMSAdmin Tool 使用的服務提供商。當前有三種受支持的值。 com.sun.jndi.ldap.LdapCtxFactory 用于 LDAP ,如果使用它就必須安裝一個 LDAP 服務器。 com.sun.jndi.fscontext.RefFSContextFactory 用于文件系統上下文,它只需要使用者提供存放上下文的文件路徑。 com.ibm.ejs.ns.jndi.CNInitialContextFactory 是專門為 websphere 提供的,它需要和 websphere 的 CosNaming 資源庫一起使用。

        PROVIDER_URL 表示會話初始上下文的 URL ,由 JMSAdmin tool 實現的所有 JNDI 操作的根。它和 INITIAL_CONTEXT_FACTORY 一一對應。

        ldap://hostname/contextname 用于 LDAP

        file:[drive:]/pathname 用于文件系統上下文

        iiop://hostname[:port]/[?TargetContext=ctx] 用于訪問 websphere CosNaming 名稱空間

        最后還有一個參數 SECURITY_AUTHENTICATION ,用于說明 JNDI 是否把安全性憑證傳遞給了您使用的服務供應商。只有當使用了 LDAP 服務供應商時,才使用此參數。此參數有三個值, none (匿名認證)、 simple (簡單認證)和 CRAM-MD5 認證機制。如果沒有提供有效值,缺省值為 none 。

        確認配置文件之后,可以在 \java\bin 目錄下啟動 JMSAdmin 控制臺。也可以在任何目錄下用下面的命令來啟動控制臺:

        JMSAdmin –cfg MQ_JAVA_INSTALL_PATH\java\bin\JMSAdmin.config

        其中 MQ_JAVA_INSTALL_PATH 為 MQSeries Client for Java 安裝的根目錄。

        若啟動失敗,則好好檢查一下您的環境變量是否設置正確。根據我個人的經驗,除了把 com.ibm.mq.jar 和 com.ibm.mqjms.jar 加入到環境變量外,還要把 fscontext.jar 和 providerutil.jar 加入到環境變量。

        進入 JMSAdmin 控制臺后,您可以自由定義 sub context 。對于子上下文的操作,主要有一下命令:

        display ctx

        define ctx(ctxname)

        change ctx(ctxname)

        change ctx(=up)

        change ctx(=init)

        delete ctx(ctxname)

        當然,在這里的主要任務并非是用來定義 sub context ,而是用來定義以下幾個對象:

        MQQueueConnectionFactory

        MQTopicConnectionFactory

        MQQueue

        MQTopic

        (還有其它的一些對象,如 MQXAQueueConnectionFactory 等,不常用到,在此不作說明。)

        可以使用很多動詞來操縱目錄名稱空間中的受管理對象。 ALTER 、 DEFINE 、 DISPLAY 、 DELETE 、 COPY 和 MOVE ,它們的用法都算比較簡單,這里只列舉一二以作說明。

        例一:定義一 QueueConnectionFactory ,連接主機 10.10.10.18 ,端口 1414

        DEFINE QCF(EXAMPLEQCF)+

        DESC(Example Queue Connection Factory)+

        TRAN(CLIENT)+

        HOST(10.10.10.18)+

        QMGR(QM_EXAMPLE)+

        CHAN(S_EXAMPLE)+

        PORT(1414)+

        CCSID(1381)

        例二:定義一 Queue ,其對應于 MQ 中的 Q_EXAMPLE

        DEFINE Q(EXAMPLEQL)+

        DESC(Local queue)+

        QMGR(QM_EXAMPLE)+

        QUEUE(Q_EXAMPLE)+

        CCSID(1381)

        四.用 JMS 實現 MQ 編程

        上面我們說明了怎樣用 JMSAdmin Tool 定義 MQ 對象的上下文。我們的最終目的是要用 JMS 來實現 MQ 編程,以實現在程序中對 MQ 隊列進行收、發消息。所以,下面我們將重點討論一下 MQ 的 JMS 實現。

        如果您對 JMS 編程很熟悉,那么您也就會用 JMS 來實現 MQ 編程,因為用 JMS 來編寫 MQ 程序與編寫一般的 JMS 程序沒有太大的差別。舉個例子,當我們想發送一條消息到 MQ 的隊列中,再從該隊列中取回消息時,我們編程時主要有四個步驟。首先我們要初始化在程序中要用到的對象,然后才可以發送消息到隊列中去,再就是收取消息了,最后要清除那些永久對象。這些都和普通的 JMS 程序相當。程序的源代碼如下:

        import java.util.Hashtable;

        import javax.jms.*;

        import javax.naming.*;

        import javax.naming.directory.*;

        public class sample {

        protected QueueConnectionFactory factory=null;

        protected QueueConnection connection;

        protected QueueSession queueSession;

        protected TextMessage outMessage;

        protected QueueSender queueSender;

        protected QueueReceiver queueReceiver;

        public static final String qcfLookup="EXAMPLEQCF";

        public static final String qLookup="EXAMPLEQL";

        public static final String icf = "com.sun.jndi.fscontext.RefFSContextFactory";

        public String url ="file:/d:/temp";

        public void sampleInit() throws Exception {

        Hashtable environment = new Hashtable();

        environment.put(Context.INITIAL_CONTEXT_FACTORY, icf);

        environment.put(Context.PROVIDER_URL, url);

        environment.put(Context.REFERRAL, "throw");

        Context ctx=new InitialDirContext(environment);

        factory = (QueueConnectionFactory)ctx.lookup(qcfLookup);

        Queue q1=null;

        q1=(Queue)ctx.lookup(qLookup);

        connection = factory.createQueueConnection();

        queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

        queueSender = queueSession.createSender(q1);

        queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        outMessage = queueSession.createTextMessage();

        queueReceiver = queueSession.createReceiver(q1);

        connection.start();

        }

        public void sendMessageOut(String message) throws JMSException {

        outMessage.setText(message);

        queueSender.send(outMessage);

        }

        public String receiveMessage() throws Exception{

        return ((TextMessage)queueReceiver.receive()).getText();

        }

        public void sampleClose() throws JMSException {

        queueSession.close();

        connection.close();

        }

        public static void main(String[] args){

        String rec;

        sample sp = new sample();

        try {

        sp.sampleInit();

        sp.sendMessageOut("Hello World!");

        java.lang.Thread.sleep(4000);

        rec=sp.receiveMessage();

        System.out.println("Receive text is : "+rec);

        sp.sampleClose();

        }catch(Exception e) {

        e.printStackTrace();

        }

        }

        }

        五.遠程管理

        MQ 在 WINDOWS 平臺下具有圖形化管理界面,但在 UNIX 平臺下卻只能通過命令行來進行操作。這樣就給使用者帶來很大的不便。我們都希望能通過圖形界面來進行管理配置。為了實現我們的想法,我們就必須建立遠程管理。

        實現遠程管理有以下幾個步驟:

        1 .被管理隊列管理器上的命令隊列 SYSTEM.ADMIN.COMMAND.QUEUE 存在并可用。對于 MQ 2 版本應執行 amqscoma.tst 腳本來創建。

        2 .使用 strmqcsv 命令來啟動被管理隊列管理器上的命令服務器。

        3 .確定被管理隊列管理器上的服務器連接通道 SYSTEM.ADMIN.SVRCONN 是否存在,如果不存在則創建它。

        4 .一般 Unix 、 Linux 平臺中 MQ 默認的字符集為 819 ,而 Windows 平臺為 1381 ,所以你必須改變其字符集,使兩邊的字符集相同。一般改被管理的字符集。

        5 .如果被管理隊列管理器上的操作用戶與管理隊列管理器上的操作用戶不同,那么你首先要確認管理隊列管理器上的操作用戶在被管理隊列管理器上存在并且有管理 MQ 的權限,再者,你需要修改服務器連接通道 SYSTEM.ADMIN.SVRCONN 的 MCAUSER 屬性為管理隊列管理器上的操作用戶。

        6 .啟動被管理隊列管理器上的偵聽器。

        做完這些工作之后,直接在管理隊列管理器的 MQ 管理工具中顯示被管理隊列管理器即可。然后你就可以象操作本地隊列管理器一樣,在被管理隊列管理器上定義你需要的 MQ 對象。

        六.通道維護

        在配置遠程連接的時候,我們曾經創建過進程定義。那我們為什么要去創建進程定義呢?這就涉及 MQ 通道維護的概念。

        通道長時間沒有消息觸發就會自動斷開連接,不再保持運行狀態。時間的長短可以由自己設定,默認值為 6000 秒。消息請求再次來臨的時候,就必須再次啟動通道。有些通道,如服務器連接通道、接收方通道等是自動觸發啟動的。當消息請求發送到通道后,通道立即啟動,進入運行狀態。但也有一些通道不會自動啟動,最典型的就是發送方通道。當有消息請求需要使用通道進行消息傳遞的時候,發送方通道也不會自動啟動并把消息發送到遠程隊列,而是把消息留在了與其相關聯的傳輸隊列中。

        但是,在實際應用中我們又不可能每過一段時間去啟動一次通道,或當有消息來再去啟動通道。那應該怎么辦?首先我們創建一個進程定義,這個進程定義的目的就是用來啟動發送方通道。然后我們在傳輸隊列的進程名稱屬性欄指定剛才定義的進程定義名稱,再把觸發器控制開關打開。這樣,當有消息進入傳輸隊列后,傳輸隊列的觸發器會啟動觸發執行指定的進程,從而啟動發送方通道,把消息傳輸到遠程隊列中去。

        七.總結

        也許你會說你已經理解了 MQ ,包括基本概念、配置、管理以及程序的編寫,那么恭喜你。我也希望如此。不過 MQ 也許并非如此簡單,因本人水平有限,也只能到此為止,希望大家再接再厲。順便說一句,如果有什么好想法,千萬別忘了告訴我一聲。

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: ibm IBM MQSeries


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>