आप एक संग्रहित प्रक्रिया लिख सकते हैं और पीएल/एसक्यूएल में संदेश को हटा सकते हैं और इसे एक्सएमएल टेक्स्ट में परिवर्तित कर सकते हैं और इसे सीएलओबी के रूप में वापस कर सकते हैं। फिर आप जावा से JDBC के साथ संग्रहीत कार्यविधि को कॉल कर सकते हैं। जब प्लेन AQ API में फीचर की कमी थी, तब मैंने पहले भी इसी तरह के वर्कअराउंड का इस्तेमाल किया था।
उदाहरण:
create or replace procedure dequeue_lcr(
p_queue_name varchar2,
p_consumer varchar2,
p_wait_seconds number,
p_lcr out clob) as
deq_lcr anydata;
deq_xml xmltype;
msgid raw(16);
deqopt dbms_aq.dequeue_options_t;
mprop dbms_aq.message_properties_t;
no_messages exception;
pragma exception_init (no_messages, -25228);
begin
deqopt.consumer_name := p_consumer;
deqopt.wait := p_wait_seconds;
deqopt.navigation := dbms_aq.first_message;
deqopt.dequeue_mode := dbms_aq.remove;
begin
dbms_aq.dequeue(
queue_name => p_queue_name,
dequeue_options => deqopt,
message_properties => mprop,
payload => deq_lcr,
msgid => msgid);
deq_xml := dbms_streams.convert_lcr_to_xml(deq_lcr);
p_lcr := deq_xml.getclobval();
commit;
exception
when no_messages then
p_lcr := null;
end;
end;
यह तब काम करता है जब मैं इसे उचित कतार और उपभोक्ता के साथ PL/SQL से कॉल करता हूँ:
declare
v_clob clob;
begin
dequeue_lcr('aqtest.hcb_queue_any', 'LOCAL_AGENT', 5, v_clob);
if (v_clob is not null) then
dbms_output.put_line('Data: ' || v_clob);
else
dbms_output.put_line('No messages');
end if;
end;
आउटपुट पैरामीटर के रूप में एक क्लॉब के साथ कॉल करने योग्य स्टेटमेंट के साथ जावा से कॉल करें और आपको जाने के लिए अच्छा होना चाहिए!