MQ 响应仅写入 1 个请求 JAVA

MQ Response only writing 1 request JAVA

我有一个程序可以一次向队列写入 4 个响应,但它只写入第一个响应,我试过这段代码。但它只向队列写入一个响应。我正在使用 ibm m 队列,以获取所有请求。但是当涉及到将请求放入队列时,第一个响应只是写入并且循环只执行一次。不知道发生了什么

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;

    }

你截断了方法的开头部分,所以我猜测 paymentResponse 是一个 ArrayList 对象。

But when it comes to putting request into the queue the first response is only writing and the loop executes only one time . Dont know what is happening

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

您有几项违反编码最佳实践。

  1. 您的 try/catch 绝不能超宽。即包含多行代码。
  2. 如果您的代码连接到某个东西,那么您的代码必须确保它正确地断开连接。
  3. 如果您的代码打开了某些东西,那么您的代码必须确保正确关闭它。
  4. 永远不要依赖系统为你工作。
  5. 您在使用变量之前不检查它们。
  6. 不要使用 MQEnvironment class 因为它不是线程安全的。
  7. 您设置了 CCSIDEncoding 而不是使用平台默认值。您的数据是否采用与本地平台不同的格式或编码?
  8. 如果您要向原始请求发送响应消息,则正确的消息类型是 MQMT_REPLY
  9. 为什么要使用 MQPMO_ASYNC_RESPONSE 的 MQPMO 选项?什么对您的回复消息如此重要以至于代码不能等待 MQ 完成?
  10. 您似乎在使用各种 MQ classes 作为常量。为什么?即 MQCMQConstants 使用 CMQC class 或 MQConstants class。不要使用 MQC,因为它已贬值。
  11. 您没有为队列管理器的连接设置用户 ID 和密码。您应该始终从一开始就实施适当的安全措施。

您的代码应如下所示:

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);
   }
}