2015-05-28 19 views
5

Tôi dường như không thể tìm ra giải pháp cho vấn đề của mình, tôi đã bị kẹt ở đây hàng giờ liền.Hàng đợi trước của Oracle - Dequeue không hoạt động

Tôi usings Oracle AQS:

 Dbms_Aqadm.Create_Queue_Table(Queue_Table  => 'ITEM_EVENT_QT', 
            Queue_Payload_Type => 'ITEM_EVENT', 
            Multiple_Consumers => TRUE); 

     Dbms_Aqadm.Create_Queue(Queue_Name   => 'ITEM_EVENT_QUEUE', 
           Queue_Table   => 'ITEM_EVENT_QT', 
           Max_Retries   => 5, 
           Retry_Delay   => 0, 
           Retention_Time  => 432000, -- 5 DAYS 
           Dependency_Tracking => FALSE, 
           COMMENT    => 'Item Event Queue'); 
     -- START THE QUEUE 
     Dbms_Aqadm.Start_Queue('ITEM_EVENT_QUEUE'); 
     -- GRANT QUEUE PRIVILEGES 
     Dbms_Aqadm.Grant_Queue_Privilege(Privilege => 'ALL', 
             Queue_Name => 'ITEM_EVENT_QUEUE', 
             Grantee  => 'PUBLIC', 
             Grant_Option => FALSE); 
    END; 

Dưới đây là một trong những thuê bao của tôi:

Dbms_Aqadm.Add_Subscriber(Queue_Name => 'ITEM_EVENT_QUEUE', 
          Subscriber => Sys.Aq$_Agent('ITEM_SUBSCRIBER_1', 
                 NULL, 
                 NULL), 
          rule => 'tab.user_data.header.thread_no = 1'); 

    Dbms_Aq.Register(Sys.Aq$_Reg_Info_List(Sys.Aq$_Reg_Info('ITEM_EVENT_QUEUE:ITEM_SUBSCRIBER_1', 
                  Dbms_Aq.Namespace_Aq, 
                  'plsql://ITEM_API.GET_QUEUE_FROM_QUEUE', 
                  HEXTORAW('FF'))),1); 

Việc đăng ký thuê bao:

Bất cứ khi nào một sự kiện nào đó xảy ra trên DB của tôi, tôi m sử dụng trình kích hoạt để thêm "sự kiện" vào AQ của tôi bằng cách gọi thủ tục sau đây từ gói ITEM_API của tôi:

Và nó hoạt động vì khi tôi kiểm tra bảng AQ, tôi có thể tìm thấy "sự kiện", tuy nhiên phương pháp dequeue của tôi không phải là dequeing, như bạn thấy trong hình dưới đây, không có DEQ_TIME.

Dưới đây là phương pháp dequeue của tôi, cũng từ gói ITEM_API tôi:

PROCEDURE GET_QUEUE_FROM_QUEUE(CONTEXT RAW, 
           REGINFO SYS.AQ$_REG_INFO, 
           DESCR SYS.AQ$_DESCRIPTOR, 
           PAYLOAD RAW, 
           PAYLOADL NUMBER) IS 

    R_DEQUEUE_OPTIONS DBMS_AQ.DEQUEUE_OPTIONS_T; 
    R_MESSAGE_PROPERTIES DBMS_AQ.MESSAGE_PROPERTIES_T; 
    V_MESSAGE_HANDLE  RAW(16); 
    I_PAYLOAD   ITEM_EVENT; 
    L_PROC_EVENT   BOOLEAN; 
    O_TARGETS   CFG_EVENT_STAGE_TBL; 
    O_ERROR_MSG   VARCHAR2(300); 
    O_STATUS_CODE  VARCHAR2(100); 
    BEGIN 
    R_DEQUEUE_OPTIONS.MSGID   := DESCR.MSG_ID; 
    R_DEQUEUE_OPTIONS.CONSUMER_NAME := DESCR.CONSUMER_NAME; 
    R_DEQUEUE_OPTIONS.DEQUEUE_MODE := DBMS_AQ.REMOVE; 
    --R_DEQUEUE_OPTIONS.WAIT   := DBMS_AQ.NO_WAIT; 
    DBMS_AQ.DEQUEUE(QUEUE_NAME   => DESCR.QUEUE_NAME, 
        DEQUEUE_OPTIONS => R_DEQUEUE_OPTIONS, 
        MESSAGE_PROPERTIES => R_MESSAGE_PROPERTIES, 
        PAYLOAD   => I_PAYLOAD, 
        MSGID    => V_MESSAGE_HANDLE); 
    IF I_PAYLOAD IS NOT NULL THEN 
     L_PROC_EVENT := PROCESS_EVENT(I_PAYLOAD, 
            O_TARGETS, 
            O_STATUS_CODE, 
            O_ERROR_MSG); 
    END IF; 
    EXCEPTION 
    WHEN OTHERS THEN 
     ERROR_HANDLER.LOG_ERROR(NULL, 
           NULL, 
           NULL, 
           SQLCODE, 
           SQLERRM, 
           O_STATUS_CODE, 
           O_ERROR_MSG); 
     RAISE; 
    END GET_QUEUE_FROM_QUEUE; 

Am tôi làm sai điều gì? Làm thế nào tôi có thể sửa lỗi này? Tôi nghĩ rằng có thể có vấn đề với việc đăng ký thuê bao của tôi, nhưng tôi không chắc chắn.

EDIT: Tôi đã chỉ ra rằng nếu tôi xóa người đăng ký và đăng ký, sau đó thêm lại họ, họ sẽ xóa tất cả tin nhắn. Howerver nếu một sự kiện khác được enqueued, nó vẫn có indefinetly (hoặc cho đến khi tôi loại bỏ và thêm các thuê bao lại):

Bản ghi với trạng thái 0 và không DEQ_TIME là mới.

Tôi có cần một trình lên lịch hoặc điều gì đó tương tự không?

EDIT: Tôi đã thêm một tuyên truyền lên lịch để AQ của tôi:

DBMS_AQADM.SCHEDULE_PROPAGATION('ITEM_EVENT_QUEUE'); 

và thậm chí thêm các lĩnh vực lần tiếp theo NEXT_TIME:

DBMS_AQADM.SCHEDULE_PROPAGATION('ITEM_EVENT_QUEUE', SYSDATE + 30/86400); 

Vẫn không hoạt động. Bất kỳ đề xuất? Tôi đoán Thông báo AQ không hoạt động và thủ tục gọi lại của tôi không bao giờ được gọi. Làm thế nào tôi có thể sửa lỗi này?

EDIT: Tôi đã xóa quy trình của mình khỏi gói chỉ nhằm mục đích kiểm tra, vì vậy đồng đội của tôi có thể biên dịch gói ITEM_API (Tôi không biết liệu có biên dịch lại gói này hay không) quá trình dequeue). Vẫn không hoạt động.

+0

Đoán của tôi: cam kết giao dịch mà bạn đã thực hiện. –

+0

nó đã được cam kết – SaintLike

Trả lời

1

Tạo một khối mã và chạy như sau:

DECLARE 
    dequeue_options  DBMS_AQ.dequeue_options_t; 
    message_properties DBMS_AQ.message_properties_t; 
    message_handle  RAW (16); 
    I_PAYLOAD   ITEM_EVENT; 
    no_messages exception; 
    msg_content   VARCHAR2 (4000); 
    PRAGMA EXCEPTION_INIT (no_messages, -25228); 
BEGIN 
    dequeue_options.wait := DBMS_AQ.NO_WAIT; 
    dequeue_options.consumer_name := 'ITEM_SUBSCRIBER_1'; 
    dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE; 
LOOP  
DBMS_AQ.DEQUEUE (queue_name   => 'ITEM_EVENT_QUEUE', 
         dequeue_options  => dequeue_options, 
         message_properties => message_properties, 
         payload    => I_PAYLOAD, 
         msgid    => message_handle 
        ); 
END LOOP; 
    EXCEPTION 
    WHEN no_messages 
    THEN 
    DBMS_OUTPUT.PUT_LINE ('No more messages left'); 
END; 

Hãy cho tôi biết những gì xảy ra với thông điệp enqueued của bạn.

Bạn nên có bảng nơi bạn đang truy xuất dữ liệu.

Bạn cũng có thể thử thêm bảng enqueud vào tác nhân và sau đó chỉ định tác nhân vào bảng dequeue.

DECLARE 
    aSubscriber sys.aq$_agent; 
BEGIN 
    aSubscriber := sys.aq$_agent('ITEM_SUBSCRIBER_1', 
          'ITEM_EVENT_QUEUE', 
          0); 
    dbms_aqadm.add_subscriber 
(queue_name  => 'ITEM_EVENT_QUEUE' 
    ,subscriber  => aSubscriber); 
END; 
/
+0

'prodman.PT_IN_MQ_TYPE' là gì? – SaintLike

+0

Xin lỗi, chỉ cần sử dụng loại tin nhắn của bạn. – Fudztown

+0

Không giúp được gì, các tin nhắn enqueued vẫn nằm trong hàng đợi như trước. Bạn nhận được +1 vì công việc bạn có. Cảm ơn. Tái bút: Tôi đã chỉnh sửa bài đăng của mình, có thể nó có thể trợ giúp – SaintLike

0

tôi phải đối mặt với cùng một vấn đề, nhưng nó đã được giải quyết sau khi thay đổi các tham số 2 DB:

  1. job_queue_processes (phải> hơn 0)
  2. aq_tm_processes (dò)

Hy vọng nó sẽ giúp.

Các vấn đề liên quan