Я пытаюсь поместить 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?