Hi Everyone,
I have a problem with implementation of publish/subscribe scenario.
The next steps are done -
0) Oracle 8.1.7.4.0
1) create a type for messaging
2) create simple (subscribing) queue and start it
3) create multiple (publishing) queue and start it
4) add a subscriber (simple queue, step #2) to the multiple queue
(step #3)
5) send a message to the multiple queue; have no exceptons - message
has a recepient.
6) try to read from the simple queue - have an timeout exception - no
messages available for dequeuing.
Additional info -
1) in the table AQ$_MSG_MULTIPLE_H I can see my message Id with
subscriber#=0
2) in the table AQ$_MSG_MULTIPLE_S subscriber with #0 has
queue_name='0' and no name
3) table MSG has no records at all
4) table MSG_MULTIPLE has a record with my message
What is the problem? Do I need to do some additional work?
Sorry if my question is too simple or stupid - I just couldn't find
the answer in Oracle examples...
Thank you,
Alexander.
createtype message_type as object (subject varchar2(30),text
varchar2(80));
begin
- create simple queue
dbms_aqadm.create_queue_table(
queue_table=>'aeme.msg',
sort_list=>'PRIORITY,ENQ_TIME',
queue_payload_type=>'aeme.message_type');
dbms_aqadm.create_queue(
queue_name=>'msg_queue',
queue_table=>'aeme.msg');
dbms_aqadm.start_queue(
queue_name=>'msg_queue');
- create multiple queue
dbms_aqadm.create_queue_table(
queue_table=>'aeme.msg_multiple',
multiple_consumers=>TRUE,
queue_payload_type=>'aeme.message_type',
compatible=>'8.1');
dbms_aqadm.create_queue(
queue_name=>'msg_queue_multiple',
queue_table=>'aeme.msg_multiple');
dbms_aqadm.start_queue(
queue_name=>'msg_queue_multiple');
end;
- add a subscriber
declare
subscriber sys.aq$_agent;
begin
subscriber := sys.aq$_agent('Test1','msg_queue',null);
dbms_aqadm.add_subscriber(
queue_name => 'msg_queue_multiple',
subscriber => subscriber,
rule => 'priority = 1');
end;
- send a message to a multiple queue (publish)
declare
eo dbms_aq.enqueue_options_t;
mp dbms_aq.message_properties_t;
msgid raw(16);
msg message_type;
begin
eo.visibility := dbms_aq.IMMEDIATE;
eo.relative_msgid := null;
eo.sequence_deviation := null;
msg := message_type('TEST', 'HELLO 1');
dbms_aq.enqueue('msg_queue_multiple',eo,mp,msg,msgid);
dbms_output.put_line('msgid='||msgid);
end;
- read a message from a simple queue
declare
dequeueopts DBMS_AQ.DEQUEUE_OPTIONS_T;
msgprops DBMS_AQ.MESSAGE_PROPERTIES_T;
msgid raw(16);
msg message_type;
begin
dequeueopts.wait := 1;
dbms_aq.dequeue( 'msg_queue', dequeueopts, msgprops, msg, msgid );
dbms_output.put_line('msgid='||msgid||', subj='||msg.subject||',
text='||msg.text);
END;
Received on Tue Oct 05 2004 - 09:19:58 CDT