我正在向 IBM MQ 发送请求并使用 JMS 接收响应。但是,即使主机上存在文本消息或字节消息,我当前也收到空响应。你能帮我理解为什么我得到一个空值吗?
我的代码是这样的。 我在此代码之前声明了用户名、CICS 事务代码、请求队列名称和回复队列名称。”
try {
logger.info("doCicsRequestReply ::: Getting JMS connections ");
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
// Setup JNDI context
Context context = new InitialContext(environment);
// Look up connection factory and destination queue
ConnectionFactory connectionFactory = (ConnectionFactory) context
.lookup("jms/MQCF");
// creating request Queue
Destination requestQueue = (Destination) context
.lookup(requestQueueName);
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
logger.info("getJMSConnection:: JMS connections created ...");
((JmsDestination) requestQueue).setIntProperty(
WMQConstants.WMQ_MQMD_MESSAGE_CONTEXT,
WMQConstants.WMQ_MDCTX_SET_IDENTITY_CONTEXT);
logger.info("doCicsRequestReply: Request queue created ");
// creating response queue
Destination replyQueue = (Destination) context
.lookup(replyToQueueName);
//Destination.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
// closing the context
context.close();
// Create connection, session, and producer
MessageProducer producer = session.createProducer(requestQueue);
logger.info("doCicsRequestReply: Request and response queue created ");
// Setting up request headers and message
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);
logger.info("doCicsRequestReply: Request header setup completed.. ");
byte blanks[] = new byte[8];
for (int i = 0; i < blanks.length; i++)
blanks[i] = (byte) ' ';
// Construct the CIH header as a byte array
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;
outData.writeInt(0); // MQLONG ReturnCode;
outData.writeInt(0); // MQLONG CompCode;
//-----continues the remaining code
// ---- make sure progName is exactly 8 characters
StringBuffer pgmName = new StringBuffer(progName);
for (int i = pgmName.length(); i < 8; i++)
pgmName.append(' ');
// ---- write program name followed by commarea
outData.writeBytes(pgmName.substring(0, 8));
outData.writeBytes(commArea);
logger.info("doCicsRequestReply: Setting byte message..");
byte[] cihRequestMessage = outBytes.toByteArray();
message.writeBytes(cihRequestMessage);
logger.info("doCicsRequestReply: Request body completed");
logger.info("doCicsRequestReply: Request message:"+outBytes);
// Send the message to queue..
producer.send(message);
logger.info("doCicsRequestReply: Request to sent to queue:"+message);
String messageID = message.getJMSMessageID();
String selector="JMSCorrelationID='"+messageID+"'";
logger.info("Selecting reply based on selector " + selector);
// Receive a message from reply queue
MessageConsumer consumer = session.createConsumer(replyQueue,selector);
//MessageConsumer consumer = session.createConsumer(replyQueue);
logger.info("doCicsRequestReply: create consumer for response... ");
Message replyMessage = consumer.receive(replyTimeout * 1000);
logger.info("doCicsRequestReply: Response received... : "+replyMessage);
if(replyMessage==null)
{
logger.info("doCicsRequestReply: its a null value... ");
responseMessage = "null";
}
else if (replyMessage instanceof TextMessage) {
logger.info(" Reply from CICS server.. TextMessage ");
String replText = ((TextMessage) replyMessage).getText();
logger.info(" Reply from CICS server.. " + replText);
responseMessage = replText;
}else if (replyMessage instanceof BytesMessage) {
logger.info(" Reply from CICS server.. TextMessage ");
BytesMessage bytesMessage = (BytesMessage) replyMessage;
int length = (int) bytesMessage.getBodyLength();
logger.info(" Reply from CICS server.. getBodyLength:: "+length);
byte[] messageBytes = new byte[length];
bytesMessage.readBytes(messageBytes);
String textMessage = new String(messageBytes, "UTF-8");
logger.info(" Reply from CICS server.. " + textMessage);
responseMessage = textMessage;
因为您有时间
receive
Message replyMessage = consumer.receive(replyTimeout * 1000);
如果没有找到消息,replyMessage
将在等待1秒后返回null
。
未找到消息,因为您在相关 ID 上有选择器。
String selector="JMSCorrelationID='"+messageID+"'";
logger.info("Selecting reply based on selector " + selector);
// Receive a message from reply queue
MessageConsumer consumer = session.createConsumer(replyQueue,selector);
但是同一应用程序刚刚放入队列的消息没有将其相关 ID 设置为任何内容。
您需要在原始消息中设置相关 ID 或选择消息 ID。
要设置相关 ID,您可以参考此链接处的示例。
IE。
String correlationID = ...
...
byte[] b = null;
String selector = "";
try {
b = correlationID.getBytes();
selector = "JMSCorrelationID='ID:" + getHexString(b) + "'";
} catch (Exception e) {
logger.info(e.getMessage());
}
...
logger.info("Selecting reply based on selector " + selector);
JMSConsumer consumer = context.createConsumer(requestQueue, selector);
使用消息头作为选择器:
String selector="JMSMessageID='"+messageID+"'";