एक तरीका यह है कि Oracle's Advanced Queuing का उपयोग किया जाए। . उस उद्देश्य के लिए आपको एक क्यू (और एक क्यू टेबल) सेट करना होगा और एक पीएल/एसक्यूएल प्रक्रिया लिखनी होगी जो कतार में अगले संदेश की प्रतीक्षा कर रही हो।
C++ पक्ष तब PL/SQL प्रक्रिया को कॉल करता है, जो अगली घटना होने पर वापस आती है।
Oracle की तरफ, आपको DBMS_SCHEDULERका उपयोग करना होगा। ए> या इसी तरह की सुविधा ईवेंट बनाने . के लिए , यानी उचित समय पर कतार में एक नया संदेश डालने के लिए।
यह अभी भी एक मतदान दृष्टिकोण है। हालांकि, दो घटनाओं के बीच बिल्कुल कोई गतिविधि नहीं है।
अपडेट करें:
यहां कुछ नमूना कोड दिया गया है।
कतार का प्रारंभिक सेटअप (संदेश में एक संख्यात्मक और एक टेक्स्ट मान होता है):
grant AQ_ADMINISTRATOR_ROLE to appuser;
grant EXECUTE ON DBMS_AQ to appuser;
grant EXECUTE ON DBMS_AQ to appuser;
CREATE TYPE sample_payload_type AS OBJECT
(
cmd VARCHAR2(20),
id NUMBER
);
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'sample_queue_table',
queue_payload_type => 'sample_payload_type',
sort_list => 'ENQ_TIME',
compatible => '10.0'
);
END;
/
BEGIN
DBMS_AQADM.CREATE_QUEUE (
queue_name => 'sample_queue',
queue_table => 'sample_queue_table'
);
DBMS_AQADM.START_QUEUE (
queue_name => 'sample_queue'
);
END;
/
पैकेज हैडर:
create or replace package sample_queue_pkg
as
procedure get_next_msg(
i_max_wait number
,o_cmd out varchar2
,o_id out number
);
procedure put_msg(
i_cmd varchar2
,i_id number
);
end sample_queue_pkg;
/
पैकेज बॉडी:
create or replace package body sample_queue_pkg
as
procedure get_next_msg(
i_max_wait number
,o_cmd out varchar2
,o_id out number
)
is
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message sample_payload_type;
NO_MESSAGE_RECEIVED EXCEPTION;
PRAGMA EXCEPTION_INIT(NO_MESSAGE_RECEIVED, -25228);
begin
dequeue_options.wait := i_max_wait;
DBMS_AQ.DEQUEUE (
queue_name => 'appuser.sample_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle
);
o_cmd := message.cmd;
o_id := message.id;
exception
when NO_MESSAGE_RECEIVED then
o_cmd := null;
o_id := null;
end get_next_msg;
procedure put_msg(
i_cmd varchar2
,i_id number
)
is
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message sample_payload_type;
message_id NUMBER;
begin
message := sample_payload_type(i_cmd, i_id);
DBMS_AQ.ENQUEUE(
queue_name => 'appuser.sample_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle
);
end put_msg;
end sample_queue_pkg;
/
डेटाबेस सर्वर निम्न कोड का उपयोग करके एक संदेश भेज सकता है:
sample_queue_pkg.put_msg('run_task', 8234);
commit;
C++ सर्वर संगृहीत sample_queue_pkg.get_next_msg
को कॉल करके संदेश की प्रतीक्षा कर सकता है (और उन्हें प्राप्त कर सकता है) . पैरामीटर i_max_wait
सेकंड में अगले संदेश की प्रतीक्षा करने के लिए अधिकतम समय निर्दिष्ट करता है। आप शायद एक लूप लागू करना चाहते हैं जो अगले संदेश की प्रतीक्षा करता है और इसे तब तक संसाधित करता है जब तक कि यह संकेत प्राप्त न हो कि सर्वर छोड़ने वाला है।