由于 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;
我对你所做的事情感到困惑。其次,有一个名为 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());