从 IBM MQ 获取 NULL 响应

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

我正在向 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;
                
java jms ibm-mq mainframe
1个回答
0
投票

因为您有时间

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+"'";


© www.soinside.com 2019 - 2024. All rights reserved.