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包
项目源码

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