JAVA連接IBM MQ

1、配置MQ

統一說明:
隊列管理器名字爲“MyTest”
使用的端口爲“1414”
本地隊列名稱爲“LOCALQUEUE”
服務器連接通道名稱爲 “SERVERCONN”

1.1、創建隊列管理器

進入IBM MQ Explorer
這裏寫圖片描述

創建隊列管理器
右鍵“隊列管理器”–>“新建”–>”隊列管理器…”
添加隊列管理器名字
這裏寫圖片描述

一直下一步到這個頁面,設定監聽端口,點擊完成成功創建隊列管理器
這裏寫圖片描述

如圖所示,爲隊列管理器創建成功
這裏寫圖片描述

1.2、新建本地隊列

展開MyTest
這裏寫圖片描述

右鍵“隊列”–>”新建”–>“本地隊列…”
輸入隊列名稱,點擊完成
這裏寫圖片描述

1.3、新建服務器連接通道

右鍵“通道”–>”新建”–>“服務器連接通道…”
這裏寫圖片描述

輸入服務器連接通道,點擊完成
這裏寫圖片描述

1.4、確認編碼字符集標識和確認端口號

右鍵”MyTest”–>”屬性…”
打開”MyTest-屬性”窗口
這裏寫圖片描述

確認編碼字符集標識爲”1381”
這裏寫圖片描述

確認端口號爲”1414”
這裏寫圖片描述

2、創建項目

2.1、簡介

該項目爲Maven結構的項目
由於ibm mq的包沒辦法從Maven的中心庫中直接下載,所以需要自行下載,文章末尾提供下載地址

2.2、項目結構

這裏寫圖片描述

2.3、代碼

2.3.1、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>mq_demo3</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>mq_demo3 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>javax.resource</groupId>
            <artifactId>connector</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

不加入javax.resource的connector包的話,會報如下錯誤
這裏寫圖片描述

2.3.2、Mq.java

package demo;

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;

public class Mq {
    static MQQueueManager qMgr;
    static int CCSID = 1381;
    static String queueString = "LOCALQUEUE";

    public static void connect() throws MQException {
        MQEnvironment.hostname = "127.0.0.1";
        MQEnvironment.channel = "SERVERCONN";
        MQEnvironment.port = 1414;
        MQEnvironment.CCSID = CCSID;
        //MQ中擁有權限的用戶名
        MQEnvironment.userID = "MUSR_MQADMIN";
        //用戶名對應的密碼
        MQEnvironment.password = "123456";

        qMgr = new MQQueueManager("MyTest");

    }

    public static void sendMsg(String msgStr) {
        int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
        MQQueue queue = null;
        try {
            // 建立Q1通道的連接
            queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
            MQMessage msg = new MQMessage();// 要寫入隊列的消息
            msg.format = MQC.MQFMT_STRING;
            msg.characterSet = CCSID;
            msg.encoding = CCSID;
            // msg.writeObject(msgStr); //將消息寫入消息對象中
            msg.writeString(msgStr);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            msg.expiry = -1; // 設置消息用不過期
            queue.put(msg, pmo);// 將消息放入隊列
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (queue != null) {
                try {
                    queue.close();
                } catch (MQException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    public static void receiveMsg() {
        int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
        MQQueue queue = null;
        try {
            queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
            System.out.println("該隊列當前的深度爲:" + queue.getCurrentDepth());
            System.out.println("===========================");
            int depth = queue.getCurrentDepth();
            // 將隊列的裏的消息讀出來
            while (depth-- > 0) {
                MQMessage msg = new MQMessage();// 要讀的隊列的消息
                MQGetMessageOptions gmo = new MQGetMessageOptions();
                queue.get(msg, gmo);
                System.out.println("消息的大小爲:" + msg.getDataLength());
                System.out.println("消息的內容:\n" + msg.readStringOfByteLength(msg.getDataLength()));
                System.out.println("---------------------------");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (queue != null) {
                try {
                    queue.close();
                } catch (MQException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws MQException {
        connect();
        sendMsg("我來測試一下");
        receiveMsg();
    }
}

2.4、運行結果

這裏寫圖片描述

3、錯誤代碼對應解決方案

3.1、思路

查詢log日誌,依據日誌來解決出現的問題
log日誌路徑(在安裝MQ時有配置,以下爲本機環境中的log日誌路徑):
D:\ProgramData\IBM\MQ\qmgrs\隊列管理器名字\errors

3.2、出現:完成代碼是 2,原因爲 2058

覈對隊列管理器的名字是否與代碼中的名字相同

3.3、出現:完成代碼是 2,原因爲 2035

3.3.1、錯誤日誌

2017/1/20 17:15:25 - Process(12856.16) User(MUSR_MQADMIN) Program(amqzlaa0.exe)
                      Host(C6HJQ9ODE5KA9KS) Installation(Installation1)
                      VRMF(9.0.0.0) QMgr(MyTest)

AMQ5540: 應用程序“WebSphere MQ Client for Java”沒有提供用戶標識和密碼。

說明:
隊列管理器已配置爲需要用戶標識和密碼,但是未提供用戶標識或密碼。
操作:
確保應用程序提供有效的用戶標識和密碼,或者將隊列管理器配置更改爲 OPTIONAL 以允
許應用程序連接未提供用戶標識或密碼的應用程序。 
----- amqzfuca.c : 4340 -------------------------------------------------------
2017/1/20 17:15:25 - Process(12856.16) User(MUSR_MQADMIN) Program(amqzlaa0.exe)
                      Host(C6HJQ9ODE5KA9KS) Installation(Installation1)
                      VRMF(9.0.0.0) QMgr(MyTest)

AMQ5541: 隊列管理器 CONNAUTH CHCKCLNT(REQDADM) 配置造成認證檢查失敗。

說明:
因爲用戶標識 'musr_mqadmin' 是特權用戶,並且隊列管理器連接權限(CONNAUTH)配置
引用了名爲 'SYSTEM.DEFAULT.AUTHINFO.IDPWOS' 且具有 CHCKCLNT(REQDADM) 的認證信息
(AUTHINFO)對象,所以已檢查該用戶標識及其密碼。 

該消息隨先前的錯誤而顯示,以澄清檢查該用戶標識和密碼的原因。
操作:
請參閱此前的錯誤以獲取更多信息。 

確保密碼由客戶機應用程序指定並確保該密碼是該用戶標識的正確密碼。隊列管理器連接
的認證配置決定了用戶標識存儲庫。例如,本地操作系統用戶數據庫或 LDAP 服務器。 

爲了避免認證檢查,您可以使用沒有特權的用戶標識,或者修改隊列管理器的認證配置。
您可以修改 CHLAUTH 記錄中的 CHCKCLNT 屬性,但通常不允許未認證的遠程訪問。 
-------------------------------------------------------------------------------
2017/1/20 17:15:26 - Process(14136.7) User(MUSR_MQADMIN) Program(amqrmppa.exe)
                      Host(C6HJQ9ODE5KA9KS) Installation(Installation1)
                      VRMF(9.0.0.0) QMgr(MyTest)

AMQ9557: “MUSR_MQADMIN”的隊列管理器用戶標識初始化失敗。

說明:
用於初始化用戶標識“MUSR_MQADMIN”的調用失敗,帶有 CompCode 2 和原因 2035。
操作:
改正錯誤並再試一次。 
----- cmqxrsrv.c : 2363 -------------------------------------------------------

3.3.2、錯誤分析

應用程序“WebSphere MQ Client for Java”沒有提供用戶標識和密碼。

3.3.3、解決方案

需要在代碼中加入用戶標識和密碼(上面的代碼中已加入)

MQEnvironment.userID = "MUSR_MQADMIN";
MQEnvironment.password = "123456";

使用其他用戶的話,需要用戶已經存在在系統中的 mqm 用戶組中

3.4、出現:完成代碼是 2,原因爲 2035(不同的錯誤日誌)

3.4.1、錯誤日誌

2017/1/20 17:22:11 - Process(14136.9) User(MUSR_MQADMIN) Program(amqrmppa.exe)
                      Host(C6HJQ9ODE5KA9KS) Installation(Installation1)
                      VRMF(9.0.0.0) QMgr(MyTest)

AMQ9776: 通道已由用戶標識阻止

說明:
由於入站通道“SERVERCONN”的活動值映射至應阻止的用戶標識,因此已從地址
“127.0.0.1”阻止該通道。該通道的活動值爲“MCAUSER(MUSR_MQADMIN)
CLNTUSER(MUSR_MQADMIN) ADDRESS(C6HJQ9ODE5KA9KS)”。
操作:
請與系統管理員聯繫,管理員應當會檢查通道認證記錄,以確保已正確配置設置。 ALTER
QMGR CHLAUTH 開關用於控制是否使用通道認證記錄。可使用 DISPLAY CHLAUTH 命令來查
詢通道認證記錄。 
----- cmqxrmsa.c : 1580 -------------------------------------------------------

3.4.2、錯誤分析

通道開啓認證,將訪問拒絕了

3.4.3、解決方案

第一種 關閉認證

進入命令行

//進入隊列管理器
>runmqsc MyTest
//查看認證記錄
display qmgr chlauth
     5 : display qmgr chlauth
AMQ8408: 顯示隊列管理器的細節。
   QMNAME(MyTest)                          CHLAUTH(ENABLED)
//將認證關閉
alter qmgr chlauth(disabled)
     7 : alter qmgr chlauth(disabled)
AMQ8005: IBM MQ 隊列管理器已更改。

第二種 將對應的用戶和主機加入認證記錄

博主還沒找到對應的代碼之後再加,有會的大神的話,希望能夠在評論區給我留言,謝謝

4、附件

IBM MQ jar包
項目源碼

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