【问题标题】:JMS Text Message on Oracle AQ from Nodejs来自 Nodejs 的 Oracle AQ 上的 JMS 文本消息
【发布时间】:2020-10-06 12:41:07
【问题描述】:

我正在尝试从 nodejs 将 jms 文本消息排入 oracle AQ 上。

const enqueue = async () => {
    try {
        await oracle.createPool();
        const connection = await oracle.getConnection();
        const jmsMessageType = "SYS.AQ$_JMS_TEXT_MESSAGE";

        const queue = await connection.getQueue(bv.REQUEST_QUEUE_NAME, {payloadType: jmsMessageType});

        const theRequest = new queue.payloadTypeClass({
            text_length: request.length,
            text_vc: request
        });
        await queue.enqOne(theRequest);
        await connection.commit();
    } catch(e){
        console.error(e);
    }
}

enqueue();

我可以看到消息在 oracle 中的 AQ 表中排队,但是消费者在尝试使消息出列时中断:

oracle.jms.AQjmsException: JMS-120: Dequeue failed
    at oracle.jms.AQjmsError.throwEx(AQjmsError.java:337)
    at oracle.jms.AQjmsConsumer.jdbcDequeueCommon(AQjmsConsumer.java:1995)
    at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:1374)
    at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:1292)
    at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:1270)
    at oracle.jms.AQjmsConsumer.receiveNoWait(AQjmsConsumer.java:1068)
    ...
Caused by: java.lang.NullPointerException
    at oracle.jms.AQjmsTextMessage.readTextMessageContainer(AQjmsTextMessage.java:328)
    at oracle.jms.AQjmsTextMessage.<init>(AQjmsTextMessage.java:161)
    at oracle.jms.AQjmsConsumer.jdbcDequeueCommon(AQjmsConsumer.java:1751)
    ... 19 more

关于 JMSTextMessage 类型的正确结构有什么想法吗?

【问题讨论】:

    标签: node.js oracle jms oracle-aq


    【解决方案1】:

    基本上只需要获取属性名称的类型和用户大写的定义。大写非常重要 - 它只是忽略了小写的属性名称。

    • SYS.AQ$_JMS_TEXT_MESSAGE
    • SYS.AQ$_JMS_HEADER
    • SYS.AQ$_JMS_USERPROPARRAY
    • SYS.AQ$_JMS_USERPROPERTY

    如果您需要更多,请看这里: https://docs.oracle.com/cd/B10501_01/appdev.920/a96612/t_jms3.htm

     const theRequest = new queue.payloadTypeClass(
                {
                    HEADER: {
                        USERID: "YOUR_USER",
                        PROPERTIES: [
                            {
                                NAME: "JMS_OracleDeliveryMode",
                                TYPE: 100,
                                STR_VALUE: "2",
                                NUM_VALUE: null,
                                JAVA_TYPE: 27
                            },
                            {
                                NAME: "JMS_OracleTimestamp",
                                TYPE: 200,
                                STR_VALUE: null,
                                NUM_VALUE: new Date().getTime(),
                                JAVA_TYPE: 24
                            }
                        ]
                    },
                    TEXT_LEN: request.length,
                    TEXT_VC: request
                }
            );
    

    【讨论】:

    猜你喜欢
    • 2011-05-02
    • 2012-03-30
    • 1970-01-01
    • 2011-05-22
    • 2013-12-28
    • 1970-01-01
    • 2013-02-26
    • 2014-05-22
    • 2013-05-04
    相关资源
    最近更新 更多