Java读取Oracle AQ RAW类型消息时遇空指针异常求助
读取Oracle AQ RAW类型消息触发空指针异常排查
报错详情
尝试通过Java应用读取Oracle AQ的RAW类型消息时触发空指针异常,报错堆栈如下:
java.lang.NullPointerException: Cannot invoke "String.equalsIgnoreCase(String)" because "<local10>" is null at oracle.jms.AQjmsConsumer.<init>(AQjmsConsumer.java:433) ~[aqapi-23.3.0.0.jar:na] at oracle.jms.AQjmsConsumer.<init>(AQjmsConsumer.java:333) ~[aqapi-23.3.0.0.jar:na] at oracle.jms.AQjmsSession.createConsumer(AQjmsSession.java:8974) ~[aqapi-23.3.0.0.jar:na] at com.thegroup.queue.advanced.oracleaq.listener.AQListener.startConsumingMessages(AQListener.java:44) ~[classes/:na]
报错发生在代码行:MessageConsumer consumer = session.createConsumer(queue);
应用代码
package com.thegroup.queue.advanced.oracleaq.listener; import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.Session; import javax.jms.TextMessage; import org.springframework.stereotype.Component; import oracle.jms.AQjmsSession; @Component public class AQListener { private final QueueConnection queueConnection; public AQListener(QueueConnection queueConnection) { this.queueConnection = queueConnection; } public void startConsumingMessages(String user, String queueName, String queueType) { try { if (queueConnection == null) { System.out.println("Failed to create QueueConnection."); return; } AQjmsSession session = (AQjmsSession) queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queueConnection.start(); if (user == null || queueName == null || user.isEmpty() || queueName.isEmpty()) { System.out.println("Invalid user or queue name."); return; } System.out.printf("Attempting to retrieve queue: user=%s, queue=%s%n", user, queueName); Queue queue = session.getQueue(user, queueName); if (queue == null) { System.out.println( "Queue not found or cannot be accessed. Please check the queue name and user permissions."); return; } MessageConsumer consumer = session.createConsumer(queue); while (true) { Message message = consumer.receive(1000); if (message != null) { switch (queueType.toUpperCase()) { case "RAW": processRawMessage(message); break; case "JMS_TEXT_MESSAGE": processTextMessage(message); break; default: System.out.printf("Unsupported queue type: %s%n", queueType); break; } } } } catch (JMSException e) { e.printStackTrace(); } } // Process RAW message (non-text) private void processRawMessage(Message message) throws JMSException { if (message instanceof BytesMessage bytesMessage) { byte[] payload = new byte[(int) bytesMessage.getBodyLength()]; bytesMessage.readBytes(payload); System.out.printf("Received RAW Message: %s%n", new String(payload)); } else { System.out.println("Received non-RAW message"); } } // Process JMS Text Message private void processTextMessage(Message message) throws JMSException { if (message instanceof TextMessage textMessage) { System.out.printf("Received JMS Text Message: %s%n", textMessage.getText()); } else { System.out.println("Received non-text message"); } } }
队列表查询结果
执行SELECT * FROM DBA_QUEUE_TABLES的查询结果截图:
补充说明
读取JMS_TEXT_MESSAGE类型的消息时一切正常,需找出RAW类型消息读取时触发空指针的解决方案。
内容的提问来源于stack exchange,提问作者NIDHEESH KRISHNA
相关产品推荐
相关产品推荐

