MQ响应仅写入1个JAVA请求

MQ响应仅写入1个JAVA请求,java,ibm-mq,Java,Ibm Mq,我有一个程序一次向队列写入4个响应,但它只是写入第一个响应,我尝试了以下代码。但它只向队列写入一个响应。我使用一个IBMM队列,以获得所有的请求。但当将请求放入队列时,第一个响应只是写入,循环只执行一次。我不知道发生了什么事 MQQueueManager queueManager = null; MQQueue queue = null; try { String queueManagerName = "TEST";`

我有一个程序一次向队列写入4个响应,但它只是写入第一个响应,我尝试了以下代码。但它只向队列写入一个响应。我使用一个IBMM队列,以获得所有的请求。但当将请求放入队列时,第一个响应只是写入,循环只执行一次。我不知道发生了什么事

MQQueueManager queueManager = null;
        MQQueue queue = null;
        try {

            String queueManagerName = "TEST";`
            String queueName = "REPONSE_QUEUE";
            String port = "1452";
            String host = "DESKTOP-32F2BVV";
            String chanel = "NEW";
            log.info("Queue Manager Name : " + queueManagerName);
            log.info("Queue Name : " + queueName);
            log.info("Port : " + port);
            log.info("Host : " + host);
            log.info("Chanel : " + chanel);

            if (null != host && host != "" && host.trim().length() > 0) {
                MQEnvironment.hostname = host;
            }
            if (null != port && port != "" && port.trim().length() > 0) {
                MQEnvironment.port = Integer.parseInt(port);
            }
            if (null != chanel && chanel != "" && chanel.trim().length() > 0) {
                MQEnvironment.channel = chanel;
            }
            queueManager = new MQQueueManager(queueManagerName.trim());
            int option = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
            log.info("Open Option : " + option);
            queue = queueManager.accessQueue(queueName.trim(), option, null, null, null);
            
            
            for(int i=0;i<paymentResponse.size();i++) {
                System.out.println(paymentResponse.size());
                System.out.println(paymentResponse.get(i));
                MQPutMessageOptions pmo = new MQPutMessageOptions();
                pmo.options = MQConstants.MQPMO_ASYNC_RESPONSE;
                MQMessage mqMessage = new MQMessage();
                // mqMessage.messageId = messageId.getBytes();
                mqMessage.format = MQC.MQFMT_STRING;
                mqMessage.feedback = MQC.MQFB_NONE;
                mqMessage.messageType = MQC.MQMT_DATAGRAM;
                mqMessage.characterSet = 1208;
                mqMessage.encoding = 546;
            // mqMessage.replyToQueueName = replayQueue.trim();
            // mqMessage.replyToQueueManagerName = replayQueueManager.trim();
            // mqMessage.writeUTF(paymentRequest);
            // mqMessage.writeString(paymentRequest);
            byte[] bytes = paymentResponse.get(i).getBytes("UTF-8");
            mqMessage.write(bytes, 0, bytes.length);
            queue.put(mqMessage, pmo);  
            }
        } catch (MQException e) {
            
            System.out.println(e);
        } catch (Exception e) {
            
            System.out.println(e);
        }

        return null;

    }
MQQueueManager=null;
MQQueue=null;
试一试{
字符串queueManagerName=“TEST”`
字符串queueName=“响应队列”;
字符串端口=“1452”;
String host=“DESKTOP-32F2BVV”;
字符串香奈儿=“新”;
log.info(“队列管理器名称:”+queueManagerName);
log.info(“队列名称:”+queueName);
日志信息(“端口:”+端口);
log.info(“主机:+Host”);
日志信息(“香奈儿:“+香奈儿”);
if(null!=主机和主机!=“”和主机.trim().length()>0){
MQEnvironment.hostname=主机;
}
如果(null!=端口和端口!=“”和端口.trim().length()>0){
MQEnvironment.port=Integer.parseInt(端口);
}
if(null!=香奈儿和香奈儿!=“”和香奈儿.trim().length()>0){
MQEnvironment.channel=chanel;
}
queueManager=新的MQQueueManager(queueManagerName.trim());
int option=MQC.MQOO_输出+MQC.MQOO_失败(如果停止);
log.info(“打开选项:+选项”);
queue=queueManager.accessQueue(queueName.trim(),option,null,null,null);

对于(inti=0;i您截断了方法的开始部分,因此我猜测
paymentResponse
是一个ArrayList对象

但在将请求放入队列时,第一个响应 只是写入,循环只执行一次。不知道是什么 正在发生

MQQueueManager queueManager = null;
        MQQueue queue = null;
        try {

            String queueManagerName = "TEST";`
            String queueName = "REPONSE_QUEUE";
            String port = "1452";
            String host = "DESKTOP-32F2BVV";
            String chanel = "NEW";
            log.info("Queue Manager Name : " + queueManagerName);
            log.info("Queue Name : " + queueName);
            log.info("Port : " + port);
            log.info("Host : " + host);
            log.info("Chanel : " + chanel);

            if (null != host && host != "" && host.trim().length() > 0) {
                MQEnvironment.hostname = host;
            }
            if (null != port && port != "" && port.trim().length() > 0) {
                MQEnvironment.port = Integer.parseInt(port);
            }
            if (null != chanel && chanel != "" && chanel.trim().length() > 0) {
                MQEnvironment.channel = chanel;
            }
            queueManager = new MQQueueManager(queueManagerName.trim());
            int option = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
            log.info("Open Option : " + option);
            queue = queueManager.accessQueue(queueName.trim(), option, null, null, null);
            
            
            for(int i=0;i<paymentResponse.size();i++) {
                System.out.println(paymentResponse.size());
                System.out.println(paymentResponse.get(i));
                MQPutMessageOptions pmo = new MQPutMessageOptions();
                pmo.options = MQConstants.MQPMO_ASYNC_RESPONSE;
                MQMessage mqMessage = new MQMessage();
                // mqMessage.messageId = messageId.getBytes();
                mqMessage.format = MQC.MQFMT_STRING;
                mqMessage.feedback = MQC.MQFB_NONE;
                mqMessage.messageType = MQC.MQMT_DATAGRAM;
                mqMessage.characterSet = 1208;
                mqMessage.encoding = 546;
            // mqMessage.replyToQueueName = replayQueue.trim();
            // mqMessage.replyToQueueManagerName = replayQueueManager.trim();
            // mqMessage.writeUTF(paymentRequest);
            // mqMessage.writeString(paymentRequest);
            byte[] bytes = paymentResponse.get(i).getBytes("UTF-8");
            mqMessage.write(bytes, 0, bytes.length);
            queue.put(mqMessage, pmo);  
            }
        } catch (MQException e) {
            
            System.out.println(e);
        } catch (Exception e) {
            
            System.out.println(e);
        }

        return null;

    }
您应该使用IDE中的调试器,因为在没有看到输出的情况下,我的第一个猜测是
paymentResponse[1]
为空。因此,它跳出循环并进入异常捕获。因此,只有1条消息被放入队列

您有几个项目不符合编码最佳实践

  • 您的try/catch永远不应该是超宽的,即包含许多行代码
  • 如果您的代码连接到某个东西,那么您的代码必须确保它正确地与之断开连接
  • 如果您的代码打开了某个东西,那么您的代码必须确保它正确地关闭它
  • 永远不要依靠一个系统为你工作
  • 在使用变量之前,不必检查它们
  • 不要使用
    MQEnvironment
    类,因为它不是线程安全的
  • 您设置了
    CCSID
    Encoding
    而不是使用平台默认值。您的数据的格式或编码是否与本地平台不同
  • 如果向原始请求发送响应消息,则正确的消息类型为
    MQMT\u REPLY
  • 为什么要使用
    MQPMO\u ASYNC\u RESPONSE
    的MQPMO选项?回复消息中有什么如此重要,以至于代码无法等待MQ完成
  • 您似乎使用了一系列MQ类作为常量。为什么?即
    MQC
    MQConstants
    使用
    CMQC
    类或
    MQConstants
    类。不要使用MQC,因为它会贬值
  • 您没有为与队列管理器的连接设置用户标识和密码。您应该始终从一开始就实施适当的安全性
  • 您的代码应该是这样的:

    String qMgrName = "TEST";
    String queueName = "REPONSE_QUEUE";
    String port = "1452";
    String host = "DESKTOP-32F2BVV";
    String channel = "NEW";
    String userId = "myUser";
    String password = "myPwd";
    
    MQQueueManager qMgr = null;
    MQQueue queue = null;
    Hashtable<String,Object> mqht = new Hashtable<String,Object>();
    int option = CMQC.MQOO_OUTPUT + CMQC.MQOO_FAIL_IF_QUIESCING;
    MQMessage mqMessage;
    byte[] bytes = new byte[0];
    
    if (null != host && host != "" && host.trim().length() > 0)
       mqht.put(CMQC.HOST_NAME_PROPERTY, host.trim());
    
    if (null != port && port != "" && port.trim().length() > 0) {
        try {
           mqht.put(CMQC.PORT_PROPERTY, new Integer(Integer.parseInt(port.trim())));
        } catch (NumberFormatException e) {
           mqht.put(CMQC.PORT_PROPERTY, new Integer(1414));  // default value
        }
    }
    
    if (null != channel && channel != "" && channel.trim().length() > 0)
        mqht.put(CMQC.CHANNEL_PROPERTY, channel.trim());
    
    if (null != userId && userId != "" && userId.trim().length() > 0)
       mqht.put(CMQC.USER_ID_PROPERTY, userId.trim());
    
    if (null != password && password != "" && password.trim().length() > 0)
       mqht.put(CMQC.PASSWORD_PROPERTY, password.trim());
    
    try {
        qMgr = new MQQueueManager(qMgrName.trim(), mqht);
        queue = qMgr.accessQueue(queueName.trim(), option);
    
        System.out.println(paymentResponse.size());
        for(int i=0; i < paymentResponse.size(); i++) {
            System.out.println(paymentResponse.get(i));
            if (null != paymentResponse.get(i)) {
               mqMessage = new MQMessage();
               mqMessage.format = CMQC.MQFMT_STRING;
               mqMessage.messageType = CMQC.MQMT_REPLY;
               try {
                  bytes = paymentResponse.get(i).getBytes("UTF-8");
                  mqMessage.write(bytes, 0, bytes.length);
                  queue.put(mqMessage, new MQPutMessageOptions());
               } catch (MQException e) {
                  System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
               } catch (IOException e) {
                  System.out.println(e);
               } catch (Exception e) {
                  System.out.println(e);
               }
            }
        }
    } catch (MQException e) {
        System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
    } catch (Exception e) {
        System.out.println(e);
    }
    finally
    {
       try {
          if (queue != null) {
             queue.close();
             System.out.println("closed: "+ queueName);
          }
       } catch (MQException e) {
          System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
       }
       try {
          if (qMgr != null) {
             qMgr.disconnect();
             System.out.println("disconnected from "+ qMgrName);
          }
       } catch (MQException e) {
          System.out.println("CC=" +e.completionCode + " : RC=" + e.reasonCode);
       }
    }
    
    String qMgrName=“TEST”;
    字符串queueName=“响应队列”;
    字符串端口=“1452”;
    String host=“DESKTOP-32F2BVV”;
    字符串通道=“新建”;
    字符串userId=“myUser”;
    字符串password=“myPwd”;
    MQQueueManager qMgr=null;
    MQQueue=null;
    Hashtable mqht=新的Hashtable();
    int option=CMQC.MQOO_输出+CMQC.MQOO_失败(如果停止);
    MQMessage MQMessage;
    字节[]字节=新字节[0];
    if(null!=主机和主机!=“”和主机.trim().length()>0)
    mqht.put(CMQC.HOST_NAME_属性,HOST.trim());
    如果(null!=端口和端口!=“”和端口.trim().length()>0){
    试一试{
    put(CMQC.PORT_属性,新整数(Integer.parseInt(PORT.trim())));
    }捕获(数字格式){
    mqht.put(CMQC.PORT_属性,新整数(1414));//默认值
    }
    }
    if(null!=通道和通道!=“”和通道.trim().length()>0)
    mqht.put(CMQC.CHANNEL_属性,CHANNEL.trim());
    if(null!=userId&&userId!=“&&userId.trim().length()>0)
    mqht.put(CMQC.USER_ID_属性,userId.trim());
    if(null!=密码和密码!=“”和密码.trim().length()>0)
    mqht.put(CMQC.PASSWORD_属性,PASSWORD.trim());
    试一试{
    qMgr=新的MQQueueManager(qMgrName.trim(),mqht);
    queue=qMgr.accessQueue(queueName.trim(),option);
    System.out.println(paymentResponse.size());
    对于(int i=0;i