1. 程式人生 > >IBM WebSphere MQ介紹安裝以及配置服務詳解

IBM WebSphere MQ介紹安裝以及配置服務詳解

類型 linq 進入 stack 系統默認 this env suse enable

首先介紹一下MQ

MQ消息隊列的簡稱是一種應用程序對應用程序的通信方法。說白了也就是通過隊列的方式來對應用程序進行數據通信。而無需專用鏈接來鏈接它們。

MQ的通訊方式

1.數據報的方式 Datagram (Send and forget)

應用程序在創建完消息後。利用MQ的API將消息發送到隊列中。它充分利用了MQ(once and once only )

2.請求和應答方式 Request/Reply

發送消息之後需等待對方處理結果。 需考慮如下問題:

a.等待應答的時間是多少?

b.如果沒有應答怎麽辦。

c.本次session是否需要保留?

MQ的開發流程

1.讓應用程序與隊列管理器鏈接,通過MQconnect調用來進行此鏈接。

2.使用MQOpen調用為輸出打開一個隊列

3.應用程序使用MQPut調用將其數據放到隊列上。

4.調用MQOpen調用打開輸入隊列

5.使用MQGet從隊列上接收數據

安裝步驟。(此處為轉載文章,作者已經證實所有步驟。)

Windows下 WebSphere MQ
服務端的安裝: ( 1)把WebSphere MQ
Windows版服務器CD-ROM插入CD-ROM驅動器。 ( 2)如果安裝了自動運行,那麽會啟動安裝進程。如果不啟動,則雙擊CD-ROM上的根目錄中的Setup圖標以啟動安裝程序。 (3)請等待,直到出現"WebSphere MQ
安裝啟動板"窗口為止。 (4)如果需要更改安裝的本地語言,單擊"選擇語言"圖標,然後從列表中選擇所需的語言。 (5)選擇必備軟件選項。 選擇典型安裝後,安裝界面上的每個安裝項右邊有一個對鉤號(表示已安裝),反之則為一個叉號(表示還沒有安裝,如果要裝 MQ,則必須先把這些軟件裝好)。 如果出現了叉號: 1)單擊項目左邊的 "+"號以顯示安裝連接; 2)選擇要使用的安裝源的選項,從以下各項選擇:
  • WebSphere MQ CD
  • 因特網
  • 網絡


( 6)安裝完成時,單擊項目左邊的"-"符號。
註意:對於定制安裝,可能不需要所有的必備軟件。 ( 7)安裝完所有的必備軟件,然後選擇"網絡先決條件"選項。 ( 8)選擇"WebSphere
MQ"安裝選項

(9)選擇啟動WebSphere
MQ安裝程序,然後等待,直到顯示了帶有歡迎信息的"WebSphere MQ安裝"窗口為止。

(10)單擊"下一步"按鈕繼續。

(11)閱讀面板上的信息和許可證條款,選擇接受,然後單擊"下一步"。

(12)如果機器上未安裝過此產品的前一個版本,則顯示"安裝類型"面板。選擇希望的安裝類型(一般選擇"典型"安裝即可),然後單擊"下一步"按鈕。

(13)"WebSphere
MQ安裝"窗口顯示"安裝WebSphere MQ就緒"信息。該窗口還顯示用戶選中的安裝摘要,單擊"安裝"開始正式安裝。

( 14)成功安裝WebSphere
MQ後,"WebSphere MQ安裝"窗口顯示以下信息:安裝向導成功完成。 ( 15)單擊"完成"按鈕啟動"準備WebSphere
MQ"向導。 技術分享圖片安裝圖示


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片
技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片

技術分享圖片

技術分享圖片


技術分享圖片


技術分享圖片


應用分析


該章節主要內容包括MQ服務端的基本配置,如隊列管理器,隊列以及通道的建立,
且包含JAVA實現的客戶端程序。由此構成一個完整的客戶端-服務器的流程。



服務端配置


1)點 "開始"->"所有程序"->"IBM
WebSphere MQ"->"WebSphere MQ 資源管理器",進入WebSphere MQ
資源管理器界面。如下圖所示:



技術分享圖片 圖9
服務端配置

技術分享圖片


2)創建名為 "QM_JACK"的隊列管理器


<1>選中 "隊列管理器"->"新建"->"隊列管理器",如下圖所示:



技術分享圖片 圖10 創建名為"QM_JACK"的隊列管理器
技術分享圖片


<2>在隊列管理中輸入 "QM_JACK",其他選項默認不變,點"下一步":



技術分享圖片 圖11 在隊列管理中輸入"QM_JACK"
技術分享圖片


<3>設置隊列日誌(本步驟采用系統默認設置),點 "下一步":



技術分享圖片 圖12
設置隊列日誌

技術分享圖片


<4>啟動隊列管理器,創建服務器連接通道,允許在 TCP/IP上進行隊列管理器的遠程管理,點擊"下一步":



技術分享圖片 圖13 創建服務器連接通道
技術分享圖片


<5>設置隊列管理器 QM_JACK的偵聽端口:8927(用戶可以根據需要自行更改端口號),點擊"完成"。



技術分享圖片圖 14
設置隊列管理器QM_JACK的偵聽端口
技術分享圖片


<6>系統進入等待界面:



技術分享圖片圖 15
系統等待界面
技術分享圖片


<7>隊列管理器 QM_JACK創建成功



技術分享圖片圖 16
系統隊列管理器QM_JACK創建成功
技術分享圖片


3)在 QM_JACK下創建名為"QUEUE_RECV"和"QUEUE_REPLY"的本地隊列(客戶可以根據自己的需求隨意更改本地隊列的名字和數量,這裏創建這兩個本地隊列只是為之後的MQ_Tuxedo項目作準備):



技術分享圖片 圖17 定義本地隊列

技術分享圖片

技術分享圖片 圖18 定義本地隊列
技術分享圖片
設置隊列名後其他屬性全為系統默認值,點擊 "確定"。 4)在 QM_JACK下創建名為"CNN_JACK"的服務器通道。
技術分享圖片圖 19
創建服務器連接通道
技術分享圖片

技術分享圖片 圖20 創建服務器連接通道
技術分享圖片
通道名稱設為 CNN_JACK,其他選項保留為系統默認設置,點擊"確定"。 5)在 MQ服務器端的計算機用戶中添加MQ客戶端所在計算機的系統用戶。比如我的MQ客戶端被Suse
Linux下的root用戶使用,那麽,我們就需要在MQ的服務端(也就是Windows
xp系統中添加名為"root"的用戶)所在的計算機系統中添加名為"root"的用戶。具體步驟如下: <1>點擊 "開始"->"控制面板"->"計算機管理"->"系統工具"->"本地用戶和組"->"用戶",點右鍵,選"新用戶",如下圖所示:
技術分享圖片 圖21
創建系統用戶

技術分享圖片


<2>創建新用戶: root(註意:這裏的用戶名"root"是MQ客戶端所在系統的用戶名,用戶要根據具體情況進行修改)


技術分享圖片圖22 創建系統用戶
技術分享圖片

隨意設置一個有效密碼,選中密碼永不過期,點擊 "創建"。 <3>將新用戶加入 mqm組(註意:這裏的mqm組是我們安裝完MQ
Server後系統自動創建的)。具體操作如下:
技術分享圖片 圖23
設置系統用戶所在組

技術分享圖片
點擊 "屬性":
技術分享圖片 圖24 設置系統用戶所在組
技術分享圖片
點擊 "添加":


技術分享圖片圖25
設置系統用戶所在組

技術分享圖片

輸入對象名稱: mqm,點擊"確定":
技術分享圖片 圖26 設置系統用戶所在組
技術分享圖片
root用戶被添入 mqm組中:


技術分享圖片圖27 設置系統用戶所在組
技術分享圖片

點擊 "應用",點擊"確定"。 重啟機器。至此, MQ服務端的配置完成。 客戶端實現   JAVA客戶端源碼 技術分享圖片
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
 * 函數功能: MQjava客戶端實現
 */

public class MQClient {

    /**
     * Logger for this class
     */
    private static final Log logger = LogFactory.getLog(MQClient.class);
    private String strExtraSendXmlFileName = "D:\\jndi.properties";
    private static Properties props;

    static {
    props = new Properties();
    props.put("mqHostName", "139.31.89.67");
    props.put("mqPort", "4032");
    props.put("mqCCSID", "1381");
    props.put("mqUserName", "liujx");
    props.put("mqPassword", "linux");
    props.put("mqQManager", "Monitor_Queue_Manager");
    props.put("mqChannel", "Monitor_Conn_Chanel");
    props.put("mqLocalOutQueue", "Q_RECEIVE");
    props.put("mqLocalInQueue", "Q_RECEIVE");

    }

    /**
     * 
     * 函數功能:TODO 主測試方法 <br>
     * 相關參數: <br>
     * 
     * @param args
     *            修改記錄: <br>
     */

    public static void main(String[] args) {

    MQClient test = new MQClient();
    // 發送消息
    test.putMsg();
    // 接收消息
    test.getMsg();
    }

    public void putMsg() {
    // MQ發送數據
    try {
        // 建立MQ客戶端應用上下文環境
        MQEnvironment.hostname = props.getProperty("mqHostName");
        MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
        MQEnvironment.CCSID = Integer
            .parseInt(props.getProperty("mqCCSID"));
        MQEnvironment.channel = props.getProperty("mqChannel");
        MQEnvironment.userID = props.getProperty("mqUserName");
        MQEnvironment.password = props.getProperty("mqPassword");
        // 連接隊列管理器
        MQQueueManager qMgr = new MQQueueManager(
            props.getProperty("mqQManager"));
        int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
        // 打開隊列
        MQQueue q = null;
        try {
        q = qMgr.accessQueue(props.getProperty("mqLocalOutQueue"),
            openOptions);
        } catch (MQException me) {
        System.out.println("打開隊列出現通訊異常" + me.getMessage() + "\n");
        return;
        }
        InputStream fins = new FileInputStream(new File(
            strExtraSendXmlFileName));
        byte[] data = new byte[fins.available()];
        fins.read(data);
        fins.close();
        MQMessage msg = new MQMessage();
        msg.write(data);
        // 放入消息
        q.put(msg);
        System.out.println("客戶端發送數據包成功..");
        // 關閉隊列
        q.close();
        // 斷開隊列管理器連接
        qMgr.disconnect();
    } catch (MQException e) {
        if (logger.isDebugEnabled())
        logger.debug(e.getMessage());
        e.printStackTrace();
    } catch (Exception e) {
        if (logger.isDebugEnabled())
        logger.debug(e.getMessage());
        e.printStackTrace();
    }
    }

    /**
     * 
     * 函數功能:TODO 獲取數據 <br>
     * 修改記錄: <br>
     */
    public void getMsg() {
    // MQ接收數據
    try {
        // 建立用上下文環境
        MQEnvironment.hostname = props.getProperty("mqHostName");
        MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort"));
        MQEnvironment.CCSID = Integer
            .parseInt(props.getProperty("mqCCSID"));
        MQEnvironment.channel = props.getProperty("mqChannel");
        MQEnvironment.userID = props.getProperty("mqUserName");
        MQEnvironment.password = props.getProperty("mqPassword");
        // 建立隊列管理器
        MQQueueManager qMgr = new MQQueueManager(
            props.getProperty("mqQManager"));
        int openOptions = MQC.MQOO_INPUT_AS_Q_DEF
            | MQC.MQOO_FAIL_IF_QUIESCING;
        // 打開隊列
        MQQueue q = qMgr.accessQueue(props.getProperty("mqLocalInQueue"),
            openOptions);
        MQGetMessageOptions mgo = new MQGetMessageOptions();
        mgo.options |= MQC.MQGMO_NO_WAIT;
        // 構造返回消息
        MQMessage msg = new MQMessage();
        if ((msg = fetchOneMsg(q)) != null) {
        byte[] xmlData = new byte[msg.getDataLength()];
        msg.readFully(xmlData);
        logger.info(new String(xmlData));
        System.out.println("接收服務器端返回數據包成功..\n接收數據為:\n"
            + new String(xmlData));
        }
        // 關閉隊列
        q.close();
        // 斷開隊列管理器
        qMgr.disconnect();
    } catch (MQException e) {
        logger.error(e);
        e.printStackTrace();
    } catch (Exception e) {
        logger.error(e);
        e.printStackTrace();
    }
    }

    /**
     * 
     * 函數功能:TODO 從隊列中取出消息 <br>
     * 相關參數: <br>
     * 
     * @param q
     * @return
     * @throws Exception
     *             修改記錄: <br>
     */
    private static MQMessage fetchOneMsg(MQQueue q) throws Exception {
    MQGetMessageOptions mgo = new MQGetMessageOptions();
    mgo.options |= MQC.MQGMO_NO_WAIT;
    MQMessage msg = new MQMessage();
    try {
        // 獲取消息
        q.get(msg, mgo);
    } catch (MQException e) {
        return null;
    }
    return msg;
    }
}
技術分享圖片

出處:https://www.cnblogs.com/swugogo/p/5917677.html

IBM WebSphere MQ介紹安裝以及配置服務詳解