2016-09-22 2138 views
2

从MQ本地队列中获取消息时,出现以下异常。这是我的代码connection.after运行代码后,我收到异常如何解决MQJE001:发生MQException:完成代码2,原因2009

MQJE001: An MQException occurred: Completion Code 2, Reason 2009 
    MQJE016: MQ queue manager closed channel immediately during connect 
    Closure reason = 2009 
    MQJE001: An MQException occurred: Completion Code 2, Reason 2009 
    MQJE016: MQ queue manager closed channel immediately during connect 
    Closure reason = 2009 
    com.ibm.mq.MQException: MQJE001: An MQException occurred: 
            Completion Code 2, Reason 2009 
    MQJE016: MQ queue manager closed channel immediately during connect 
    Closure reason = 2009 

这里是我的代码

public class Demo { 
      private MQQueueManager _queueManager = null; 
      public int port = 1422; 
      public String hostname = "192.168.1.5";//IP OF HOST 
      public String channel = "QM_ORANGE.QM_APPLE";//channel name 
      public String qManager = "QM_ORANGE";//queue manager name 
      public String inputQName = "Q1";//remote q type 
      public String outputQName = "QM_APPLE";//queue manager 

      public Demo() { 
       super(); 
      } 

      private void init(String[] args) throws IllegalArgumentException { 
       // Set up MQ environment 
       MQEnvironment.hostname = hostname; 
       MQEnvironment.channel = channel; 
       MQEnvironment.port = port; 
      } 

      public static void main(String[] args) { 

       Demo readQ = new Demo(); 

       try { 
        readQ.init(args); 
        readQ.selectQMgr(); 
        readQ.read(); 
        readQ.write(); 
       } catch (IllegalArgumentException e) { 
        System.out 
          .println("Usage: java MQRead <-h host> <-p port> <-c channel> <-m QueueManagerName> <-q QueueName>"); 
        System.exit(1); 
       } catch (MQException e) { 
        System.out.println(e); 
        System.exit(1); 
       } 
      } 

      private void read() throws MQException { 
       int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING 
         + MQC.MQOO_INPUT_SHARED; 

       MQQueue queue = _queueManager.accessQueue(inputQName, openOptions, 
         null, // default q manager 
         null, // no dynamic q name 
         null); // no alternate user id 

       System.out.println("MQRead v1.0 connected.\n"); 

       int depth = queue.getCurrentDepth(); 
       System.out.println("Current depth: " + depth + "\n"); 
       if (depth == 0) { 
        return; 
       } 

       MQGetMessageOptions getOptions = new MQGetMessageOptions(); 
       getOptions.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING 
         + MQC.MQGMO_CONVERT; 
       while (true) { 
        MQMessage message = new MQMessage(); 
        try { 
         queue.get(message, getOptions); 
         byte[] b = new byte[message.getMessageLength()]; 
         message.readFully(b); 
         System.out.println(new String(b)); 
         message.clearMessage(); 
        } catch (IOException e) { 
         System.out.println("IOException during GET: " + e.getMessage()); 
         break; 
        } catch (MQException e) { 
         if (e.completionCode == 2 
           && e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE) { 
          if (depth > 0) { 
           System.out.println("All messages read."); 
          } 
         } else { 
          System.out.println("GET Exception: "+e); 
         } 
         break; 
        } 
       } 
       queue.close(); 
       _queueManager.disconnect(); 
      } 

      private void selectQMgr() throws MQException { 
       _queueManager = new MQQueueManager(qManager); 
      } 

      private void write() throws MQException { 
       int lineNum = 0; 
       int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING; 
       try { 
        MQQueue queue = _queueManager.accessQueue(outputQName, openOptions, 
          null, // default q manager 
          null, // no dynamic q name 
          null); // no alternate user id 

        DataInputStream input = new DataInputStream(System.in); 

        System.out.println("MQWrite v1.0 connected"); 
        System.out.println("and ready for input, terminate with ^Z\n\n"); 

        // Define a simple MQ message, and write some text in UTF format.. 
        MQMessage sendmsg = new MQMessage(); 
        sendmsg.format = MQC.MQFMT_STRING; 
        sendmsg.feedback = MQC.MQFB_NONE; 
        sendmsg.messageType = MQC.MQMT_DATAGRAM; 
        sendmsg.replyToQueueName = "ROGER.QUEUE"; 
        sendmsg.replyToQueueManagerName = qManager; 

        MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the 
                      // defaults, 
                      // same 
        // as MQPMO_DEFAULT constant 

        String line = "test message"; 
        sendmsg.clearMessage(); 
        sendmsg.messageId = MQC.MQMI_NONE; 
        sendmsg.correlationId = MQC.MQCI_NONE; 
        sendmsg.writeString(line); 

        // put the message on the queue 

        queue.put(sendmsg, pmo); 
        System.out.println(++lineNum + ": " + line); 

        queue.close(); 
        _queueManager.disconnect(); 

       } catch (com.ibm.mq.MQException mqex) { 
        System.out.println(mqex); 
       } catch (java.io.IOException ioex) { 
        System.out.println("An MQ IO error occurred : " + ioex); 
       } 

      } 
     } 
+0

您是否检查[this](http://www-01.ibm.com/support/docview.wss?uid=swg21226703)是否有潜在的原因? – Gas

+1

你想连接什么样的频道?该名称建议发送者或接收者频道。您需要连接到服务器连接通道。 –

+0

其服务器连接通道 –

回答

1

的评论者是正确的基础上,看起来像一个MCA通道,而不是MQI通道的命名。但是,当我测试客户端连接到RCVR通道时,我会返回2539=MQRC_CHANNEL_CONFIG_ERROR

另一方面,2009年使用连接到MQI频道的客户端的原因很多。几乎所有的人都出现在QMgr的错误日志中,所以如果问题是“如何解决2009?”答案是“重新创建错误并立即查看QMgr的AMQERR01.LOG文件。”

一些可能性包括...

  • 通过关闭退出。
  • 由CONNAUTH关闭。
  • QMgr资源错误。
  • 通道已被配置锁定。

许多MQ开发问题只能通过查看队列管理器生成的诊断消息来解决。除其他原因外,限制可泄漏给攻击者的信息是安全设计的一部分。 MQ Admin可以知道详细信息,但攻击者应该找回相当模糊的结果。在合法的应用程序开发环境中,开发人员有望访问QMgr诊断程序,攻击者不会这样做。所以去获取错误日志。

如果出于某种原因,您无法说服MQ管理员提供日志数据或者无法访问日志数据,则可以在桌面上设置您自己的功能完整的,完全授权的免费MQ服务器。有关如何下载MQ Advanced for Developers的信息,请访问标记wiki。 (将鼠标悬停在标签上并单击弹出对话框中的'信息'以转到此处。)

您还可以观看No-Cost, Fully Licensed IBM MQ Sandbox这是一个视频教程,解释如何使用MQ Advanced for Developers创建专用红帽虚拟机,使用所有免费和完全授权的软件,包括去哪里获得虚拟化软件和Red Hat OS。

完成设置后,创建一个与您的Integration Test QMgr配置类似的QMgr,重新创建错误并检查日志。如果连接成功并且至少无法重新创建错误,则可以返回到MQ管理员,因为知道这不是您的代码,那就是问题所在。

相关问题