1

我正在尝试将 JMS-Bytes-Message ( AQ$_JMS_BYTES_MESSAGE) 作为缓冲消息排入 Oracle AQ 并使用 Java JMS 读取它。要发送消息,我使用以下 PL/SQL 代码:

declare
    L_JmsMessage        sys.AQ$_JMS_BYTES_MESSAGE;
    L_EnqueueOptions    DBMS_AQ.ENQUEUE_OPTIONS_T;
    L_MessageProperties DBMS_AQ.MESSAGE_PROPERTIES_T;
    L_MsgId             raw(16);
    L_Queue             varchar2(80) := 'MYQUEUE';
    L_Payload           blob;
    L_CorrId            varchar2(100);

    dest_offset         integer := 1;
    src_offset          integer := 1;
    lang_context        integer := 0;
    l_warning           integer;
begin
    L_EnqueueOptions.VISIBILITY := DBMS_AQ.IMMEDIATE;
    L_EnqueueOptions.DELIVERY_MODE := DBMS_AQ.BUFFERED;

    L_MessageProperties.CORRELATION := L_CorrId;
    L_MessageProperties.PRIORITY    := 90;
    L_MessageProperties.DELAY       := DBMS_AQ.NO_DELAY;


    DBMS_LOB.createTemporary(L_Payload, true);
    DBMS_LOB.ConvertToBlob(L_Payload, createCLOB(2001), DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, 0, lang_context, l_warning);

    dbms_output.put_line('L_Payload length: '|| DBMS_LOB.GETLENGTH(L_Payload));

    L_jmsMessage := sys.aq$_jms_bytes_message.construct;
    L_jmsMessage.set_type('HttpResponse');
    L_jmsMessage.set_bytes(L_Payload);
    L_jmsMessage.set_string_property('COMPRESSED', 'false');

    DBMS_AQ.ENQUEUE(
      queue_name         => L_Queue
     ,enqueue_options    => L_EnqueueOptions
     ,message_properties => L_MessageProperties
     ,payload            => L_jmsMessage
     ,msgid              => L_MsgId
    );

    dbms_lob.freeTemporary(L_Payload);
end;
/

只要有效载荷不超过 2000 个字符,它就可以正常工作。一旦有效负载大于 2000 个字符(如 2001),我就会收到以下 SQL 错误: ORA-25293: Lob attributes must be null for buffered operations.

将 AQ 交付模式设置为从DBMS_AQ.BUFFERED到时,DBMS_AQ.PERSISTENT它适用于任何尺寸。

根据 Oracle 文档(Enqueuing Buffered Messages),它指出:

缓冲消息的队列类型可以是 ADT、XML、ANYDATA 或 RAW。对于具有 LOB 属性的 ADT 类型,只能将具有空 LOB 属性的缓冲消息排入队列。

使用的类型显然是 ADT(JMS 类型)。

有谁知道通过 Oracle AQ 发送缓冲 JMS 消息的解决方案?

4

1 回答 1

0

我只是看了一下aq$_jms_bytes_message. 那里说

set_bytes 如果有效负载的长度 <= 2000,则将 RAW 中的有效负载设置为 bytes_raw,否则设置为 bytes_lob。

根据此评论,无法将大于 2000 字节的 JMS 消息作为缓冲 AQ 消息发送。

连同我的问题和此评论中提到的文档引用,很清楚为什么我会收到 ORA-25293 异常。

于 2020-02-13T14:07:09.213 回答