Oracle:事件未传递到链事件步骤(DBMS\u调度程序。定义链事件步骤)
我设置了一个调度程序链来测试链事件步骤对事件的反应。Oracle:事件未传递到链事件步骤(DBMS\u调度程序。定义链事件步骤),oracle,dbms-scheduler,Oracle,Dbms Scheduler,我设置了一个调度程序链来测试链事件步骤对事件的反应。 未传递事件(消息) Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production "CORE 12.1.0.2.0 Production" TNS for Linux: Version 12.1.0.2.0 - Production NLSRTL Version 12.
未传递事件(消息)
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE 12.1.0.2.0 Production"
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production
有什么想法吗
谢谢,
沃尔夫冈
我使用队列表wb\U event\U queue\U选项卡为多个使用者定义了一个DBMS\U AQADM队列wb\U event\U queue
和队列表的以下类型
CREATE OR REPLACE TYPE wb_event_msg_type AS OBJECT (
name VARCHAR2(100),
result NUMBER(5)
);
链条仅由两个步骤组成。
第一个(用DEFINE\u CHAIN\u STEP定义)在收件人列表中使用“SCHEDULER$\u EVENT\u AGENT”将消息排队
l_message_properties.recipient_list(0):=sys.aq$_agent(''SCHEDULER$_EVENT_AGENT'', null, null);
第二步(定义链事件步骤)在第一步完成时开始,以便从第一步提取事件
DBMS_SCHEDULER.DEFINE_CHAIN_EVENT_STEP (
chain_name => 'wb_chain_event_step'
, step_name => 'wb_step_dequeue'
, event_condition => 'tab.user_data.result=0'.
, queue_spec => 'wb_event_queue'
);
我把链条穿过
begin --run chain
DBMS_SCHEDULER.RUN_CHAIN(
chain_name => 'wb_chain_event_step'
, job_name => 'wb_job_event_step'
, start_steps => 'wb_step_enqueue'
);
end;
/
但是,消息挂起在消息表中。名为“SCHEDULER$\u EVENT\u AGENT”的使用者在事件队列中等待。
作业wb\u作业事件\u步骤未完成 要设置的代码
CREATE OR REPLACE TYPE wb_event_msg_type AS OBJECT (
name VARCHAR2(100),
result NUMBER(5)
);
/
begin --create queue
DBMS_AQADM.create_queue_table (
queue_table => 'wb_event_queue_tab'
, queue_payload_type => 'wb_event_msg_type'
, multiple_consumers => true
);
DBMS_AQADM.create_queue (
queue_name => 'wb_event_queue'
, queue_table => 'wb_event_queue_tab'
);
DBMS_AQADM.start_queue (
queue_name => 'wb_event_queue'
, enqueue => true
, dequeue => true
);
end;
/
declare --create chain
my_job_action varchar2(4000) := ''
||'DECLARE'
||' l_enqueue_options DBMS_AQ.enqueue_options_t;'
||' l_message_properties DBMS_AQ.message_properties_t;'
||' l_message_handle RAW(16);'
||' l_event_msg wb_event_msg_type;'
||'BEGIN'
||' l_message_properties.recipient_list(0) := sys.aq$_agent(''SCHEDULER$_EVENT_AGENT'', null, null);'
||' l_event_msg := wb_event_msg_type(''wolfgang'', 0);'
||' DBMS_AQ.enqueue(queue_name => ''wb_event_queue'', '
||' enqueue_options => l_enqueue_options, '
||' message_properties => l_message_properties, '
||' payload => l_event_msg, '
||' msgid => l_message_handle);'
||''
||'END;'
;
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
program_name => 'wb_prog_result2event'
, program_type => 'PLSQL_BLOCK'
, program_action => my_job_action
, number_of_arguments => 0
, enabled => true
);
DBMS_SCHEDULER.CREATE_CHAIN(chain_name => 'wb_chain_event_step');
DBMS_SCHEDULER.DEFINE_CHAIN_EVENT_STEP (
chain_name => 'wb_chain_event_step'
, step_name => 'wb_step_dequeue'
, event_condition => 'tab.user_data.result=0'
, queue_spec => 'wb_event_queue'
);
DBMS_SCHEDULER.DEFINE_CHAIN_STEP(
chain_name => 'wb_chain_event_step'
, step_name => 'wb_step_enqueue'
, program_name => 'wb_prog_result2event'
);
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name =>'wb_chain_event_step'
, condition =>'true'
, action =>'start wb_step_enqueue'
, rule_name =>'wb_rule_enqueue'
);
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name =>'wb_chain_event_step'
, condition =>'wb_step_enqueue COMPLETED'
, action =>'start wb_step_dequeue'
, rule_name =>'wb_rule_dequeue'
);
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name =>'wb_chain_event_step'
, condition =>'wb_step_dequeue COMPLETED'
, action =>'end'
, rule_name =>'wb_rule_end'
);
DBMS_SCHEDULER.ENABLE('wb_chain_event_step');
end;
/
要清理的代码
execute dbms_scheduler.stop_job(job_name=>'wb_job_event_step');
begin --drop chain
DBMS_SCHEDULER.DROP_CHAIN_RULE(
chain_name => 'wb_chain_event_step'
, rule_name=>'wb_rule_enqueue'
);
DBMS_SCHEDULER.DROP_CHAIN_RULE(
chain_name => 'wb_chain_event_step'
, rule_name=>'wb_rule_dequeue'
);
DBMS_SCHEDULER.DROP_CHAIN_RULE(
chain_name => 'wb_chain_event_step'
, rule_name => 'wb_rule_end'
);
DBMS_SCHEDULER.DROP_CHAIN_STEP(
chain_name => 'wb_chain_event_step'
, step_name => 'wb_step_enqueue'
);
DBMS_SCHEDULER.DROP_CHAIN_STEP(
chain_name => 'wb_chain_event_step'
, step_name => 'wb_step_dequeue'
);
DBMS_SCHEDULER.DROP_PROGRAM(
program_name => 'wb_prog_result2event'
);
DBMS_SCHEDULER.DROP_CHAIN(
chain_name => 'wb_chain_event_step'
);
end;
/
begin --drop queue
DBMS_AQADM.stop_queue (
queue_name => 'wb_event_queue'
);
DBMS_AQADM.drop_queue(
queue_name => 'wb_event_queue'
);
DBMS_AQADM.drop_queue_table(
queue_table => 'wb_event_queue_tab'
end;
/
drop type wb_event_msg_type;
/