Невозможно включить большие объекты размером более 2000 байтов в качестве буферизованного сообщения в Oracle AQ - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь поместить 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 он отлично работает с любым size.

Согласно документации Oracle ( постановка в очередь буферизованных сообщений ) указано:

Тип очереди для буферизованных сообщений может быть ADT, XML, ANYDATA или RAW. Для типов ADT с атрибутами LOB можно ставить в очередь только буферизованные сообщения с нулевыми атрибутами LOB.

Очевидно, что используемый тип является ADT ( JMS-типы ).

Кто-нибудь знает решение для отправки буферизованных сообщений JMS через Oracle AQ?

1 Ответ

0 голосов
/ 13 февраля 2020

Я только что посмотрел на спец. c из aq$_jms_bytes_message. Там указано, что

set_bytes устанавливает полезную нагрузку в RAW в bytes_raw, если длина полезной нагрузки <= 2000, в противном случае в bytes_lob. </p>

Согласно этому комментарию, не можно отправлять JMS-сообщения размером более 2000 байт в виде буферизованного AQ-сообщения.

Вместе с цитатой из документации, упомянутой в моем вопросе и в этом комментарии, становится понятно, почему я получаю ORA-25293 исключение.

...