使用 JMS 发送请求并从 IBM MQ 获取回复时,从大型机收到 2110 MQRC 格式错误

问题描述 投票:0回答:1

由于 IBM 迁移,以前使用的连接池管理器不再受支持。因此,我正在寻找一种发送消息的替代方法。需要注意的是,用于发送消息的现有代码如下所示。我尝试将其转换为等效的 JMS 代码。但是,我不确定此转换的格式是否正确。在大型机端进行测试时,会导致“2110 MQRC 格式错误”。您能否检查并验证此转换的准确性?”


OLD CODE:
 // ---- set request message header
      MQMessage reqMsg = new MQMessage();
      reqMsg.messageId        = CMQC.MQMI_NONE;
      reqMsg.correlationId    = CMQC.MQCI_NEW_SESSION;
      reqMsg.userId           = racfUserid;
      reqMsg.characterSet     = CHARSET_IBM500;
      reqMsg.format           = CMQC.MQFMT_CICS;
      //reqMsg.format           = CMQC.MQFMT_STRING;
      reqMsg.replyToQueueName = replyToQueueName;
      reqMsg.encoding         = CMQC.MQENC_FLOAT_S390 |
                                CMQC.MQENC_DECIMAL_NORMAL |
                                CMQC.MQENC_INTEGER_NORMAL;
      reqMsg.persistence      = persistence;


//  ---- create request message
      String result = "";
      try {
         byte blanks[] = new byte[8];
         for (int i=0; i<blanks.length; i++)
            blanks[i] = (byte)' ';
         reqMsg.clearMessage();
         // ---- write MQCIH
         reqMsg.writeString ("CIH ");              // MQCHAR4   StrucId;
         reqMsg.writeInt (2);                      // MQLONG    Version;
         reqMsg.writeInt (180);                      // MQLONG    StrucLength;
         reqMsg.writeInt (reqMsg.encoding);        // MQLONG    Encoding;
         reqMsg.writeInt (reqMsg.characterSet);    // MQLONG    CodedCharSetId;
         reqMsg.writeString (CMQC.MQFMT_STRING);       // MQCHAR8   Format;
         reqMsg.writeInt (4);                      // MQLONG    Flags;
         reqMsg.writeInt (0);                      // MQLONG    ReturnCode;

CONVERTED CODE:


// ---- set request message header
BytesMessage message = session.createBytesMessage();
            // Request Headers
message.setJMSMessageID(MQConstants.MQMI_NONE.toString());
message.setJMSCorrelationIDAsBytes(MQConstants.MQCI_NEW_SESSION);
message.setJMSReplyTo(replyQueue);
message.setStringProperty("JMS_IBM_MQMD_UserIdentifier", racfUserid);
message.setIntProperty("JMS_IBM_MQMD_CodedCharSetId",
                    CHARSET_IBM500);
message.setStringProperty("JMS_IBM_MQMD_Format",
                    MQConstants.MQFMT_CICS);
message.setIntProperty("JMS_IBM_MQMD_Encoding", messageEncoding);
message.setIntProperty("JMS_IBM_MQMD_Persistence", persistence);

//  ---- create request message
ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
            DataOutputStream outData = new DataOutputStream(outBytes);

outData.writeBytes("CIH "); // MQCHAR strucId
outData.writeInt(2); // MQLONG version
outData.writeInt(180); // MQLONG strucLength
outData.writeInt(messageEncoding); // MQLONG encoding
outData.writeInt(CHARSET_IBM500); // MQLONG CodedCharSetId;
outData.writeBytes(MQConstants.MQFMT_STRING); // MQCHAR8 Format;
outData.writeInt(4); // MQLONG Flags;
java jms ibm-mq mainframe cics
1个回答
0
投票

我对你所做的事情感到困惑。其次,有一个名为 MQCIH 的 MQ 类,用于处理 CICS 消息。

正确的做法是:

MQMessage sendMsg = new MQMessage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutput dataOutput = new DataOutputStream(baos);

MQCIH cih = new MQCIH();

cih.setVersion(version);
cih.setEncoding(encoding);
cih.setCodedCharSetId(CCSID);
cih.setFlags(flags);
cih.setReturnCode(returnCode);
cih.setCompCode(compCode);
cih.setReason(reason);
cih.setUOWControl(UOWControl);
cih.setGetWaitInterval(getWaitInterval);
cih.setLinkType(linkType);
cih.setOutputDataLength(outputDataLength);
cih.setFacilityKeepTime(facilityKeepTime);
cih.setADSDescriptor(aDSDescriptor);
cih.setConversationalTask(conversationalTask);
cih.setTaskEndStatus(taskEndStatus);
cih.setCursorPosition(cursorPosition);
cih.setErrorOffset(errorOffset);
cih.setInputItem(inputItem);
cih.setFormat(format);
cih.setFacility(tempFacility)
cih.setFunction(function);
cih.setAbendCode(abendCode);
cih.setAuthenticator(authenticator);
cih.setReplyToFormat(replyToFormat);
cih.setRemoteSysId(remoteSysId);
cih.setRemoteTransId(remoteTransId);
cih.setTransactionId(transactionId);
cih.setFacilityLike(facilityLike);
cih.setAttentionId(attentionId);
cih.setStartCode(startCode);
cih.setCancelCode(cancelCode);
cih.setNextTransactionId(nextTransactionId);

cih.write(dataOutput);

sendMsg.write(baos.toByteArray());

sendMsg.writeString("This is a test message");

sendMsg.format = CMQC.MQFMT_CICS;
sendMsg.messageType = CMQC.MQMT_DATAGRAM;
sendMsg.messageId = CMQC.MQMI_NONE;
sendMsg.correlationId = CMQC.MQCI_NONE;

queue.put(sendMsg, new MQPutMessageOptions());
© www.soinside.com 2019 - 2024. All rights reserved.