You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的查询结果截图:
DBA_QUEUE_TABLES查询结果

补充说明

读取JMS_TEXT_MESSAGE类型的消息时一切正常,需找出RAW类型消息读取时触发空指针的解决方案。

内容的提问来源于stack exchange,提问作者NIDHEESH KRISHNA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:40:57