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.
Đoán của tôi: cam kết giao dịch mà bạn đã thực hiện. –
nó đã được cam kết – SaintLike