イベントに対するチェーン イベント ステップの反応をテストするために、スケジューラ チェーンをセットアップしました。
イベント (メッセージ) は配信されません。
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_event_queue_tab を使用して DBMS_AQADM キュー wb_event_queue を定義し、キュー テーブル用に次のタイプを定義しました。
CREATE OR REPLACE TYPE wb_event_msg_type AS OBJECT (
name VARCHAR2(100),
result NUMBER(5)
);
チェーンは2段のみ。最初のもの (DEFINE_CHAIN_STEP で定義) は、受信者リストに「SCHEDULER$_EVENT_AGENT」を含むメッセージをキューに入れます。
l_message_properties.recipient_list(0):=sys.aq$_agent(''SCHEDULER$_EVENT_AGENT'', null, null);
2 番目のステップ (DEFINE_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'
);
私は経由してチェーンを実行しました
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$_EVENT_AGENT' という名前のコンシューマーがイベント キューで待機しています。
ジョブ wb_job_event_step が終了しません。
設定するコード。
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;
/