我正在运行一个简单的Java客户端来连接到远程MQ队列。
当我运行Java代码来读取带有别名队列名称的写消息时,它可以正常工作。
当我尝试在同一队列上运行代码但具有物理队列名称时(因为我希望调用getQueueDepth),我在代码尝试建立连接时得到2035错误
队列中的权限是: browse + dsp + get + inq + put + set + setall
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; 公共类MQSniffer {
/**
* @param args
*/
/**
* @param args
*/
public static void main(String[] args) {
String hostname = "XXXX";
String channel = "CHANNEL";
String qManager = "qmgr";
MQQueueManager qMgr;
MQEnvironment.hostname = hostname;
MQEnvironment.channel = channel;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,MQC.TRANSPORT_MQSERIES);
try {
qMgr = new MQQueueManager(qManager);
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE | MQC.MQOO_OUTPUT ;
MQQueue system_default_local_queue =
qMgr.accessQueue("PHYSICAL_QUEUE_NAME", // *****Get an exception on this call*****
openOptions,
null,
null,
null);
System.out.println("****Current Depth is "+ system_default_local_queue.getCurrentDepth());
MQMessage hello_world = new MQMessage();
hello_world.writeUTF("Hello World!");
MQPutMessageOptions pmo = new MQPutMessageOptions();
system_default_local_queue.put(hello_world,pmo);
System.out.println("Put the message");
system_default_local_queue.close();
// Disconnect from the queue manager
qMgr.disconnect();
}
catch (MQException ex)
{
System.out.println("An MQSeries error occurred : Completion code " +
ex.completionCode +
" Reason code " + ex.reasonCode);
ex.printStackTrace();
}
catch (java.io.IOException ex)
{
System.out.println("An error occurred whilst writing to the message buffer: " + ex);
}
}
}
om.ibm.mq.MQException:MQJE001:完成代码2,原因2035 at com.ibm.mq.MQQueueManager.accessQueue(MQQueueManager.java:2858) 在org.ku.benchmarkos.MQSniffer.main(MQSniffer.java)
感谢任何帮助!
由于 Ĵ
答案 0 :(得分:3)
WMQ检查遇到的第一个对象的权限。因此,如果您打开别名,则会在别名而非基本队列上检查权限。如果打开基本队列,则会在基本队列上检查权限,而不是在可能指向它的任何别名上检查权限。不期望打开别名的能力意味着能够打开基本队列。需要使用适当的权限对别名和基本队列运行setmqaut。
我在此处发布了更长的解释: Understanding WebSphere MQ authorization and the setmqaut command 。
答案 1 :(得分:2)
如果权限设置为别名,则只能通过别名访问队列。如果您在队列上设置了权限,则只有通过实际队列名称而不是别名才能访问队列,这同样有效。
答案 2 :(得分:1)
2035权限不足 - 您需要请求MQ管理员协助。