我正在尝试将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 types)。
有谁知道通过Oracle AQ发送缓冲的JMS消息的解决方案?
最佳答案
我只是看了aq$_jms_bytes_message
的规格。在那里说
如果有效载荷的长度
根据此注释,不可能将大于2000字节的JMS消息作为缓冲的AQ消息发送。
很清楚,为什么我会收到ORA-25293异常,再加上我的问题和评论中提到的文档引用。
关于java - 无法将大于2000字节的LOB作为缓冲消息入Oracle AQ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60208770/