代码之家  ›  专栏  ›  技术社区  ›  Mark Brady

Oracle高级队列-队列传播

  •  4
  • Mark Brady  · 技术社区  · 16 年前

    编辑:这似乎是因为两个队列在同一个模式中。

    我正在尝试队列传播,但在目标队列中看不到记录。但这很容易,因为我没有把所有的部分都准备好。


    CREATE OR REPLACE TYPE test_payload AS OBJECT(
       test_id   NUMBER,
       test_dt   DATE);
    
    
    DECLARE
       subscriber   SYS.aq$_agent;
    BEGIN
    --- Create Originating Queue and start it
    
       DBMS_AQADM.create_queue_table( queue_table => 'Test_MQT', queue_payload_type => 'Test_Payload',
                                      multiple_consumers => TRUE ); --- multiple subscriber 
    
       DBMS_AQADM.create_queue( 'Test_Q', 'Test_MQT' );
       DBMS_AQADM.start_queue( queue_name => 'Test_Q' );
    
    --- Create Destination Queue and start it
    
       DBMS_AQADM.create_queue_table( queue_table => 'Dest_MQT', queue_payload_type => 'Test_Payload',
                                      multiple_consumers => TRUE );
       DBMS_AQADM.create_queue( 'Dest_Q', 'Dest_MQT' );
       DBMS_AQADM.start_queue( queue_name => 'Dest_Q' );
    
    --- Add Subscriber and schedule propagation
    
       subscriber := SYS.aq$_agent( 'test_local_sub', 'Dest_Q', NULL );
       DBMS_AQADM.add_subscriber( queue_name => 'Test_Q', subscriber => subscriber );
       DBMS_AQADM.schedule_propagation( queue_name => 'Test_Q', destination_queue => 'Dest_Q' );
    END;
    
    DECLARE
       enqueue_options      DBMS_AQ.enqueue_options_t;
       message_properties   DBMS_AQ.message_properties_t;
       message_handle       RAW( 16 );
       MESSAGE              test_payload;
    BEGIN
       MESSAGE := test_payload( 2, SYSDATE );
       DBMS_AQ.enqueue( queue_name => 'Test_Q', enqueue_options => enqueue_options,
                        message_properties => message_properties, payload => MESSAGE, msgid => message_handle );
       COMMIT;
    END;
    
    DECLARE
       dequeue_options      DBMS_AQ.dequeue_options_t;
       message_properties   DBMS_AQ.message_properties_t;
       message_handle       RAW( 16 );
       MESSAGE              test_payload;
    BEGIN
       dequeue_options.navigation := DBMS_AQ.first_message;
       DBMS_AQ.dequeue( queue_name => 'Dest_Q', dequeue_options => dequeue_options,
                        message_properties => message_properties, payload => MESSAGE, msgid => message_handle );
       DBMS_OUTPUT.put_line( 'Test_ID: ' || MESSAGE.test_id );
       DBMS_OUTPUT.put_line( 'Test_Date: ' || MESSAGE.test_dt );
       COMMIT;
    END;
    
    3 回复  |  直到 16 年前
        1
  •  1
  •   TheSoftwareJedi jac    16 年前

    也许你需要启用它?

    DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE(queue_name => 'Test_Q'); 
    
        3
  •  0
  •   TheSoftwareJedi jac    16 年前

    您需要拥有传播目标队列的默认订阅服务器。需要有东西在那里听