文档章节

JAVA连接IBM MQ

E
 Ellision
发布于 2017/01/22 09:38
字数 1758
阅读 188
收藏 0

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

© 著作权归作者所有

E
粉丝 0
博文 4
码字总数 5401
作品 0
福州
程序员
私信 提问
在 Oracle 数据库和 IBM WebSphere MQ 下使用 Mule ESB (第三部分)

在这个三段博文的 第一部分,我们创建一个HTTP REST服务,它能够从一个Oracle HR 数据库中获取应聘者记录,并且以JSON格式返回数据。在 第二部分,我们看看在不用任何代码情况下,利用SOAP组...

oschina
2013/06/01
2.1K
1
IBM MQSeries使用指南

随着计算机网络和分布式应用的不断发展,远程消息传递越来越成为应用系统中不可缺少的组成部分。商业消息中间件的出现保证了消息传输的可靠性,高效率和安全性,同时也减少了系统的开发周期。...

crazyinsomnia
2010/02/01
953
0
IBM MQ 连接报错

一台 Win 服务器, 在 1414 端口上有 IBM 的 MQ 在本地的 Win 系统上 telnet 测试 端口是通的 在本地的 linux 系统上,telnet 测试 端口不通,nmap 扫描下,也没有发现 1414 端口, 但用 nc 命令...

2017/04/15
285
1
IBM WebSphere MQ win 安装过程

1:解压之后 点击setup.exe,选择WebSphereMQ 安装 点击“启动IBM WebSphere MQ 安装程序”; 2:点击定制,下一步 3:选择Windows 客户机和下边那个java,下一步 4:点击安装,等待页面出现,...

程序猿付显
2014/01/15
228
2
轻巧易用的消息中间件VMQ开发日志1

说到消息中间件,一般都会想到广泛使用的IBM MQ,其它的诸如Tuxedo等都已没落,国内似乎没有特别出色的产品,曾经用过TongLinkQ,唯一留给我深刻印象的只有繁琐的配置和一些BUG。开源世界里的...

calvinwilliams
2014/06/03
188
1

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
3
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
5
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部