gpt4 book ai didi

java - 无法将大于 2000 字节的 LO 作为缓冲消息排队到 Oracle AQ 中

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:05 25 4
gpt4 key购买 nike

我正在尝试将 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;
/

只要 Paylod 不超过 2000 个字符,它就可以正常工作。一旦有效负载大于 2000 个字符(如 2001),我就会收到以下 SQL 错误:ORA-25293: 对于缓冲操作,Lob 属性必须为 null

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

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

The queue type for buffered messaging can be ADT, XML, ANYDATA, or RAW. For ADT types with LOB attributes, only buffered messages with null LOB attributes can be enqueued.

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

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

最佳答案

我刚刚查看了 aq$_jms_bytes_message 的规范。其中指出

set_bytes sets payload in RAW into bytes_raw if the length of payload is <= 2000, otherwise into bytes_lob.

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

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

关于java - 无法将大于 2000 字节的 LO 作为缓冲消息排队到 Oracle AQ 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60208770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com