IBM WebSphere MQ 7.5基本用法

1、下載7.5 Trial版本html

http://www.ibm.com/developerworks/downloads/ws/wmq/java

這是下載網址,下載前先必須註冊IBM ID,下載完成後一路Next便可(注:windows上安裝時,會詢問是否域環境,初次學習時,爲簡單起見,建議選擇No)linux

安裝完成後,MQ的Bin目錄會自動添加到環境變量Path中,之後就能夠直接用Dos命令行窗口操做(固然,也能夠用圖形化GUI方式經過IBM WebSphere MQ Explorer來管理)web

注:安裝時,強烈建議用管理員Administrator身份安裝,不然安裝完成後,有可能license沒法生效、runmqsc命令模式下沒法正常執行命令.數據庫

 

2、建立隊列管理器windows

WIN + R鍵,輸入cmd,進入命令行窗口,鍵入:安全

crtmqm QM_TEST服務器

建立一個隊列管理器QM_TEST(你能夠改爲本身想要的名字),若是把整個MQ理解成一個數據庫實例,QM_TEST至關於就是db instance中的schema(或user)ide

命令行建立的隊列管理器默認是不活動狀態的,能夠用post

strmqm QM_TEST

來啓動隊列管理器

 

3、建立隊列

若是說「隊列管理器」是db中的schema,那麼"隊列"就至關於db中的Table了,而隊列中的每條"消息",就至關於Table中的每條記錄,繼續在命令行窗口模式下,輸入

runmqsc QM_TEST

將進入MQ的交互命令模式,繼續輸入

define qlocal(Q1)

將建立一個本地隊列Q1(你能夠改爲本身須要的名字),若是此時你打開 "開始菜單->程序->IBM WebSphere MQ->WebSphere MQ Explorer (Installation1)"也能同步在圖形界面下,看到這個隊列

最後鍵入end,退出MQ的交互命令模式。

 

4、發送消息

繼續在Windows命令模式下,輸入

amqsput Q1 QM_TEST

這裏系統將處於等待用戶輸入的狀態,隨便輸入一些消息,而後連敲二次回車,完成消息發送

 

5、接收消息

amqsget Q1 QM_TEST

把剛纔的put換成了get,將從隊列管理器QM_TEST的隊列Q1中,把消息取出來

 

6、進階指南

熟悉以上命令行操做後,還能夠用圖形化的操做方式再強化一遍(建議仍是多用命令行模式,由於有些操做只能用命令行完成,好比後面要提到的修改隊列管理器編碼)

WebSphere MQ Explorer中,從"幫助"菜單裏調出幫助文檔,裏面有一個不錯的教程,強烈推薦新手看一遍

不過,"教程2:將消息發送至遠程隊列"這裏,幫助文檔上有幾個細節沒講透,致使初次用命令行照着作,可能會不成功,幾個要點以下:

一、通道命名問題

發送方與接收方的通道名稱,必須同樣,這樣二邊才能對應起來

二、接收方必需要有偵聽器,並且要處於激活狀態

三、發送方的發送通道中,鏈接名稱格式爲:"<接收方HostName或IP地址>(接收方-隊列管理器-偵聽器的TCP端口) ,不包括"<>「,好比好比:yangjm(1514)或172.12.134.14(1514)

四、發送方的發送通道必須處於激活狀態,若是通道啓動失敗,嘗試右鍵->ping/復位,若是還不行,檢查上述要點1-3是否設置有問題

 

7、遠程鏈接問題

圖形方式添加「遠程隊列管理器」時,若是遠程隊列也是7.x或以上版本,當前登陸用戶是管理員時,將提示權利不足,拒絕鏈接,緣由是7.0以上,MQ提升了安全性,會默認攔截管理員,詳情可參考IBM上的解釋 http://www-01.ibm.com/support/docview.wss?uid=swg21636532

解決方式:

1. 更換當前用戶,建一個mqm用戶組(MQ安裝後,會默認建立該Windows用戶組)的用戶,而後以該用戶身份登陸操做

2.參考IBM上的解釋,若是出於學習目的,最簡單的作法,就是在runmqsc交互模式下,鍵入

ALTER QMGR CHLAUTH(DISABLED)  直接關閉通道認證(生產環境不推薦這麼作)

 

另外,要想本機上的隊列能被遠程管理,前提是該隊列管理器容許遠程管理,操做方式:隊列管理器上右擊->選擇"遠程管理...",接下來的事情你們都知道

 

8、字符集編碼問題

每一個隊列管理器,都有一個CCSID的屬性,對應的就是字符集編碼,在windows系統中,這個編碼應該是1381,若是你是用其它OS(好比linux)的配置經過腳本導入MQ的,可能編碼就不是1381了,這會致使在windows上沒法鏈接\啓動隊列管理器,能夠經過MQ交互命令行修改,

runmqsc QM_TEST 進入QM_TEST的MQ交互模式

DISPLAY QMGR CCSID 查看當前的CCSID屬性

ALTER QMGR CCSID(1381) 修改字符集編碼爲1381

 

9、如何從「試用版」升級成「正式版」

試用版默認只能用90天,到期後,若是購買了正式版的license,能夠經過命令行導入license,命令以下:

setmqprd x:\license\amqpcert.lic

注:amqpcert.lic中的P即表明這是Product生產版本,setmqprd 後面的路徑即爲license文件的所在路徑

 

10、java鏈接示例代碼 

import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/*
 * 能夠在MQ的資源管理器的某一個隊列上放入測試消息、瀏覽消息等
 * 能夠放入多條消息,按先進先出的方式取得
 */
public class MQTest {

    private String qManager;// QueueManager名

    private MQQueueManager qMgr;

    private MQQueue qQueue;

    String HOST_NAME;

    int PORT = 0;

    String Q_NAME;

    String CHANNEL;

    int CCSID;

    String Msg;

    public void init() {

        try {
            HOST_NAME = "yangjm";//Hostname或IP
            PORT = 1414;//要有一個偵聽器,處於活動狀態,且監聽1414端口
            qManager = "QM_APPLE";
            Q_NAME = "Q1";//Q1是一個本地隊列
            CHANNEL = "DC.SVRCONN";//QM_APPLE上要建一個名爲DC.SVRCONN的服務器鏈接通道
            CCSID = 1381; // 表示是簡體中文,
                            // CCSID的值在AIX上通常設爲1383,若是要支持GBK則設爲1386,在WIN上設爲1381。

            
            

            MQEnvironment.hostname = HOST_NAME; // 安裝MQ所在的ip address
            MQEnvironment.port = PORT; // TCP/IP port

            MQEnvironment.channel = CHANNEL;
            MQEnvironment.CCSID = CCSID;

            qMgr = new MQQueueManager(qManager);

            
            int qOptioin = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE
                    | MQC.MQOO_OUTPUT;

            qQueue = qMgr.accessQueue(Q_NAME, qOptioin);

        } catch (MQException e) {
            System.out
                    .println("A WebSphere MQ error occurred : Completion code "
                            + e.completionCode + " Reason Code is "
                            + e.reasonCode);
        }
    }

    void finalizer() {
        try {
            qQueue.close();
            qMgr.disconnect();
        } catch (MQException e) {
            System.out
                    .println("A WebSphere MQ error occurred : Completion code "
                            + e.completionCode + " Reason Code is "
                            + e.reasonCode);
        }
    }

    /*
     * 取過一次,下次就沒有了
     */
    public void GetMsg() {
        try {
            MQMessage retrievedMessage = new MQMessage();

            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options += MQC.MQPMO_SYNCPOINT;

            qQueue.get(retrievedMessage, gmo);

            int length = retrievedMessage.getDataLength();

            byte[] msg = new byte[length];

            retrievedMessage.readFully(msg);

            String sMsg = new String(msg);
            System.out.println(sMsg);

        } catch (RuntimeException e) {
            e.printStackTrace();
        } catch (MQException e) {
            if (e.reasonCode != 2033) // 沒有消息
            {
                e.printStackTrace();
                System.out
                        .println("A WebSphere MQ error occurred : Completion code "
                                + e.completionCode
                                + " Reason Code is "
                                + e.reasonCode);
            }
        } catch (java.io.IOException e) {
            System.out
                    .println("An error occurred whilst to the message buffer "
                            + e);
        }
    }

    public void SendMsg(byte[] qByte) {
        try {
            MQMessage qMsg = new MQMessage();
            qMsg.write(qByte);
            MQPutMessageOptions pmo = new MQPutMessageOptions();

            qQueue.put(qMsg, pmo);

            System.out.println("The message is sent!");
            System.out.println("\tThe message is " + new String(qByte, "GBK"));
        } catch (MQException e) {
            System.out
                    .println("A WebSphere MQ error occurred : Completion code "
                            + e.completionCode + " Reason Code is "
                            + e.reasonCode);
        } catch (java.io.IOException e) {
            System.out
                    .println("An error occurred whilst to the message buffer "
                            + e);
        }

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        MQTest mqst = new MQTest();
        mqst.init();
        try {
            mqst.SendMsg("你好,Webshpere MQ 7.5!".getBytes("GBK"));
            mqst.GetMsg();
        } catch (Exception e) {
            e.printStackTrace();
        }
        mqst.finalizer();
    }

}
View Code

 須要引用的jar包(在MQ的安裝目錄下都有)

附示例源代碼下載地址: http://pan.baidu.com/s/1qWrs9iO

 

 11、機器之間遷移

若是要在多臺機器上配置相同的隊列管理器,一臺臺機器去建立、設置十分繁瑣,能夠用命令

dmpmqcfg -m QM_TEST -A > C:\SCRIPT\QM_TEST_SCRIPT.DUMP

注:其中QM_TEST即爲要導出的隊列管理器名稱,而 "QM_TEST_SCRIPT.DUMP"是導出腳本的文件名,能夠隨便修改,執行完後會在"C:\SCRIPT\"下生成一個「.dump」的腳本文件,這裏咱們借用了管道操做符號">"

在另外一臺機器上,先把dump文件複製過去(好比就放在c盤根目錄下),而後按下列步驟執行

crtmqm QM_TEST

strmqm QM_TEST

runmqsc QM_TEST < C:\QM_TEST_SCRIPT.DUMP > C:\QM_TEST_SCRIPT.OUT

這表示runmqsc命令將對 QM_TEST操做,操做的命令來源於腳本文件 C:\QM_TEST_SCRIPT.DUMP,而執行結果會輸出到 C:\QM_TEST_SCRIPT.OUT

 

 

出處:http://www.cnblogs.com/yjmyzz/p/3505325.html

相關文章
相關標籤/搜索