Diagram
From the diagram, we can see two following point:
- queue1 and queue2 should enable both enqueue and dequeue operation.
- when dequeue from queue2@db2, consumer name should be same as subscriber in queue@db1
Implement scirpt
DB1
conn / as sysdba@db1 create role my_aq_user_role; Scenario 1: conn aqadm/aqadm@db1 2. create user aquser and grant queue user privilege 3. use aqadm create queue table and queue(msg_queue, payload=aqadm.my_payload) exec dbms_aqadm.create_queue(queue_name => 'MSG_QUEUE',queue_table => 'MSG_QUEUE_TAB'); exec dbms_aqadm.start_queue(queue_name => 'MSG_QUEUE',enqueue => TRUE,dequeue => TRUE); exec dbms_aqadm.add_subscriber(queue_name => 'MSG_QUEUE',subscriber => SYS.AQ$_AGENT('OMS','aqadm.FF_msg_queue@FF_OMS_Q.WALMART.COM',NULL)); EXEC dbms_aqadm.schedule_propagation(queue_name => 'MSG_QUEUE',destination => 'FF_OMS_Q.WALMART.COM'); 4. use aquser to enqueue message to aqadm.FF_msg_queue@FF_OMS_Q.WALMART.COM conn aquser/aquser@db1 |
DB2
conn / as sysdba@db2 conn aqadm/aqadm@db2 2. create user aquser and grant queue user privilege 3. use aqadm create queue table and queue(msg_queue, payload=aqadm.my_payload) exec dbms_aqadm.create_queue(queue_name => 'FF_MSG_QUEUE',queue_table => 'FF_MSG_QUEUE_TAB'); exec dbms_aqadm.start_queue(queue_name => 'FF_MSG_QUEUE',enqueue => true,dequeue => TRUE); --exec dbms_aqadm.add_subscriber(queue_name => 'FF_MSG_QUEUE',subscriber => SYS.AQ$_AGENT('FF',null,NULL)); conn aquser/aquser@db2 |
Troubshooting
when there is error during the process of enqueuing and dequeuing, there are some views and table you may need to refer to.
- user_queue_schedule: informaton about the propagation happened right now.
- queue_table(msg_queue_table,ff_msg_queue_tab@ff_oms_q.walmart.com): when enqueue message from msg_queue, dblink dequeue the message from source queue(msg_queue) immediately and equeue to the destination queue. Then at the destination, the real customer can dequeue the message.