连接IBM MQ原因码报2035的错误解决方法

因为已经有了IBM MQ的一些开发经验,当看到2035的时候就应该意识到是权限问题导致的。如下图

MQJE001: 完成代码为 '2',原因为 '2035'。
Exception in thread "main" com.ibm.mq.MQException: MQJE001: 完成代码为 '2',原因为 '2035'。
	at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:247)
	at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:588)
	at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:630)
	at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:107)
	at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:205)
	at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:911)
	at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:799)
	at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:750)
	at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:157)
	at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:681)
	at com.yusys.SendMsg.connect(SendMsg.java:30)
	at com.yusys.SendMsg.main(SendMsg.java:76)

当然你也可以查看MQ的error文件夹下的日志文件,里面有详细的错误说明。

下面是测试代码:

package com.yusys;


import java.io.IOException;

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.msg.client.wmq.v6.base.internal.MQC;

public class SendMsg {
	static MQQueueManager qMgr;
	static int CCSID = 1381;
	static String queueName = "RQ_0000";
	static String message;
	
	public static void connect() throws MQException{
		MQEnvironment.hostname = "172.20.35.98";
		MQEnvironment.channel = "JMS_RECEIVE";
		MQEnvironment.port = 1416;
		MQEnvironment.CCSID = CCSID;
		//MQ中拥有权限的用户名
		MQEnvironment.userID = "MUSR_MQADMIN";
		//用户名对应的密码
		MQEnvironment.password = "123456";
		
		qMgr = new MQQueueManager("QMA");
	}
	
	public static void sendMsg(String msgStr){
		int openOptions = MQC.MQOO_OUTPUT|MQC.MQOO_FAIL_IF_QUIESCING;
		MQQueue queue = null;
		try {
			//打开队列
			queue = qMgr.accessQueue(queueName, openOptions);
			//创建消息缓冲区
			MQMessage msg = new MQMessage(); 
			//设置放置消息选项
			MQPutMessageOptions pmo = new MQPutMessageOptions();
			//要发送的消息数据
			msg.format = MQC.MQFMT_STRING;
			msg.characterSet = CCSID;
			msg.encoding = CCSID;
			msg.writeString(msgStr);
			msg.expiry = -1;//设置消息永不过期
			queue.put(msg,pmo);
			qMgr.commit();
	
		} catch (MQException e) {
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			if(queue!=null){
				try {
					queue.close();
				} catch (MQException e) {
					e.printStackTrace();
				} finally{
					try {
						qMgr.disconnect();
					} catch (MQException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	
	public static void main(String[] args) throws MQException{
		connect();
//		String msg = HttpClientUtil.doGet("http://localhost:8080/user/all");
//		sendMsg(msg);
		sendMsg("庄生晓梦迷蝴蝶,望帝春心托杜鹃");
		System.out.println("插入结束");
	}
}

通常情况下,MQ客户端和MQ服务器通讯时,使用MQ服务器端的服务连接通道在MCAUSER属性中指定的用户作为MQ客户端连上来时使用的用户,如果MCAUSER属性值为空,则使用MQ客户端在操作系统使用的用户作为MQ客户端连上来时使用的用户,通讯时,报2035错误,就是由于客户端与服务器端通讯时所使用的用户没有权限造成的,解决方法有两种。

方法一:

假如在服务器的服务连接通道定义中设置MCAUSER属性的值为MUSR_MQADMIN(通道定义名JMS_RECEIVE):ALTER CHANNEL(JMS_RECEIVE) CHLTYPE(SVRCONN) MCAUSER(MUSR_MQADMIN) 一定要确保MUSR_MQADMIN用户为mqm组的成员,具体如下命令:

usermod -g groupname username(修改已有的用户的所在组)

useradd -g groupname username(创建新用户及所在组)

方法二:

若保持MQ服务器端的通道定义的MCAUSER属性值为空缺省值,即为空,则可将MQ客户端所使用的用户添加到MQ服务器所在的操作系统中,例如,若MQ客户端使用的用户为ADMIN,则在MQ服务器添加用户ADMIN,并保证此用户在MQ服务器端的mqm组中,以及有执行队列管理器上的操作所必需的权限。


特别提醒:当在windows下声明mca认证后,发现还报2035,有可能是因为通道认证记录设置阻止。只需要修改一下用户列表即可。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值