因为已经有了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,有可能是因为通道认证记录设置阻止。只需要修改一下用户列表即可。