Security 连接到基本队列时获取2035

Security 连接到基本队列时获取2035,security,ibm-mq,Security,Ibm Mq,我正在运行一个简单的Java客户端来连接到远程MQ队列 当我运行Java代码来读写别名为queue name的消息时,它工作得很好 当我尝试在同一个队列上运行代码,但使用一个物理队列名称(因为我希望调用getQueueDepth)时,在代码尝试建立连接时会出现2035错误 队列上的权限是: 浏览+dsp+get+inq+put+set+setall java代码如下所示 导入com.ibm.mq.MQC; 导入com.ibm.mq.MQEnvironment; 导入com.ibm.mq.MQEx

我正在运行一个简单的Java客户端来连接到远程MQ队列

  • 当我运行Java代码来读写别名为queue name的消息时,它工作得很好

  • 当我尝试在同一个队列上运行代码,但使用一个物理队列名称(因为我希望调用getQueueDepth)时,在代码尝试建立连接时会出现2035错误

  • 队列上的权限是: 浏览+dsp+get+inq+put+set+setall

    java代码如下所示 导入com.ibm.mq.MQC; 导入com.ibm.mq.MQEnvironment; 导入com.ibm.mq.MQException; 导入com.ibm.mq.MQGetMessageOptions; 导入com.ibm.mq.MQMessage; 导入com.ibm.mq.MQPutMessageOptions; 导入com.ibm.mq.MQQueue; 导入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 位于com.ibm.mq.MQQueueManager.accessQueue(MQQueueManager.java:2858) 位于org.ku.benchmarkos.MQSniffer.main(MQSniffer.java)

    感谢您的帮助

    谢谢
    J

    2035权限不足-您需要请求MQ管理员协助。

    WMQ检查遇到的第一个对象的权限。因此,如果打开别名,将检查别名而不是基本队列上的权限。如果打开基本队列,将在基本队列上检查权限,而不是在可能指向该队列的任何别名上检查权限。打开别名的能力并不意味着打开基本队列的能力。需要对别名和具有适当权限的基本队列运行setmqaut


    我在这里发布了一个较长的解释:。

    如果将权限设置为别名,则只能通过别名访问队列。如果您对队列设置了权限,则同样有效。您只能通过真实队列名称而不是别名访问队列。

    谢谢您的回复。是2035是不足够的权限。但我不能理解的是:1。当我使用别名而不是基本/物理队列名称时,我可以读取/注销队列。2.权限已设置为“浏览+dsp+get+inq+put+set+setall”。我不知道应该有什么其他权限。是的,这就是队列的问题,basde队列没有正确的权限。谢谢你的回复。