zoukankan      html  css  js  c++  java
  • 全面学习ORACLE Scheduler特性(7)Scheduler抛出的Events

    四、使用Events

      Event直译对应的中文解释是指事件,不过单纯讲事件毕竟太抽象了,举个示例来形容吧。A(对应某个应用程序,或者是ORACLE中的进程)在干活时突然眉头一皱说道,不好,前方有情况,这可怎么办!这时,只见它认真想了想,过了一会儿脸上一喜说道:有了,俗话说早请示啊晚汇报,出现情况要找领导,赶紧给领导发消息呗!于是B(也是对应某个应用或ORACLE进程)就收到了一条A发过来的"前方有XX情况"的消息,这个过程就叫EVENT(含A发消息以及B接收消息)。

      SCHEDULER 中有两种触发EVENT的情况:

    • Scheduler 触发的Events

      Scheduler 中触发的Events,一般是说当前schduler中job的状态发生修改,类似job启动,或者运行结束,或者达到运行时间等诸如此类的动作,都能够抛出一个EVENT,接收到EVENT的applicate就可以根据这些信息进行适当的处理。

      比如说,由于系统太过于繁忙,超出job启动时间后30分钟,job仍然没能顺利启动,那么这个时候,Scheduler就可以抛出一条EVENT给外部的应用,以便外部应用能够及时通知DBA,进行处理。

    • application 触发的Events

      外部的应用也可以触发Events,并且由Scheduler来接收并处理这一类型的Events。所谓Scheduler处理EVENT就是指Scheduler启动相应的job来执行相关操作,这类job在创建时专门声明了event的处理,这样当接收到EVENT时,这类job就会启动。

      Scheduler 使用Oracle高级队列来抛出以及销毁Events。当抛出Schduler触发的Events时,Scheduler将消息入队到默认的event队列,application则通过检查该队列来处理Events。当抛出application触发的Events时,application将消息入队到处理job对应的队列中。

      下面我们也按照这两个类型来介绍Scheduler中的Events。

    4.1 Scheduler抛出的Events

      前面说了,Scheduler抛出的Events一般是指job状态改变时触发的,那么是不是说只要job状态发生了改变,就会触发Events,其实并非如此,因为默认情况下,job是不触发Events的。

      Scheduler 中的job有一个属性叫raise_events,专门用来设置job触发Events的条件,该属性在CREATE_JOB时不能执行,因此默认情况下该属性不会赋值,自然也就不会触发EVENT。要设置raise_events属性,只能是在job创建完成后,通过SET_ATTRIBUTE过程修改job的raise_events属性。

      例如,修改前面创建的job-,启用raise_events属性,执行语句如下:

    SQL> BEGIN

      2  DBMS_SCHEDULER.SET_ATTRIBUTE('INSERT_TEST_TBL', 'raise_events',  DBMS_SCHEDULER.JOB_ALL_EVENTS)

      3  END;

      4  /

      PL/SQL procedure successfully completed.

      上述示例中指定的raise_events属性的属性值DBMS_SCHEDULER.JOB_ALL_EVENTS,就是抛出Events的触发条件。

      触发Events的有下列的类型,分别代表不同的操作:

    • job_started :JOB启动;
    • job_succeeded :JOB成功结束;
    • job_failed :JOB执行失败;
    • job_broken :JOB被置为BROKEN状态;
    • job_completed :JOB达到最大运行次数,或者运行的结束日期;
    • job_stopped :JOB被STOP_JOB过程置为停止执行的状态;
    • job_sch_lim_reached :Job的schedule达到限定值;
    • job_disabled :JOB被置于DISABLE状态;
    • job_chain_stalled :运行于chain的JOB被置于CHAIN_STALLED状态;
    • job_all_events :含上述提到的所有类型;
    • job_run_completed :由于Job运行出错、成功结束或被手动停止。

      起用raise_events后,Scheduler就会按照设定的触发条件,当达到触发条件时,即会抛出事件信息到SYS.SCHEDULER$_EVENT_QUEUE队列。

      例如,手动执行一次INSERT_TEST_TBL,看看是否向队列中记录信息,操作如下:

    SQL> exec dbms_scheduler.run_job('INSERT_TEST_TBL');

      PL/SQL procedure successfully completed.

      执行下列脚本,出队数据:

    SQL> set serveroutput on

    SQL> DECLARE

      2    l_dequeue_options    DBMS_AQ.dequeue_options_t;

      3    l_message_properties DBMS_AQ.message_properties_t;

      4    l_message_handle     RAW(16);

      5    l_queue_msg          sys.scheduler$_event_info;

      6  BEGIN

      7    l_dequeue_options.consumer_name := 'TEST';

      8

      9    DBMS_AQ.dequeue(queue_name         => 'SYS.SCHEDULER$_EVENT_QUEUE',

     10                    dequeue_options    => l_dequeue_options,

     11                    message_properties => l_message_properties,

     12                    payload            => l_queue_msg,

     13                    msgid              => l_message_handle);

     14    COMMIT;

     15

     16    DBMS_OUTPUT.put_line('event_type : ' || l_queue_msg.event_type);

     17    DBMS_OUTPUT.put_line('object_owner : ' || l_queue_msg.object_owner);

     18    DBMS_OUTPUT.put_line('object_name : ' || l_queue_msg.object_name);

     19    DBMS_OUTPUT.put_line('event_timestamp: ' || l_queue_msg.event_timestamp);

     20    DBMS_OUTPUT.put_line('error_code : ' || l_queue_msg.error_code);

     21    DBMS_OUTPUT.put_line('event_status : ' || l_queue_msg.event_status);

     22    DBMS_OUTPUT.put_line('log_id : ' || l_queue_msg.log_id);

     23    DBMS_OUTPUT.put_line('run_count : ' || l_queue_msg.run_count);

     24    DBMS_OUTPUT.put_line('failure_count : ' || l_queue_msg.failure_count);

     25    DBMS_OUTPUT.put_line('retry_count : ' || l_queue_msg.retry_count);

     26  END;

     27  /

    event_type : JOB_STARTED

    object_owner : TEST

    object_name : INSERT_TEST_TBL

    event_timestamp: 25-AUG-09 12.49.29.558758 PM +08:00

    error_code : 0

    event_status : 1

    log_id :

    run_count : 1

    failure_count : 0

    retry_count : 0

      PL/SQL procedure successfully completed.

      从返回的信息可以看到,event的类型为JOB_STARTED,表示JOB启动。实际上job:INSERT_TEST_TBL执行一次至少会向队列中插入两条event信息,一条为JOB_STARTED,一条则为JOB_SUCCEEDED(也可能是JOB_FAILED),这里不详细演示,感兴趣的朋友不妨自行测试。

      提示:SYS.SCHEDULER$_EVENT_QUEUE队列基于SYS.SCHEDULER$_EVENT_QTAB队列表,因此查询SYS.SCHEDULER$_EVENT_QTAB也可以获取上述的信息。

      SYS.SCHEDULER$_EVENT_QUEUE 是一个固定队列,实际应用的过程中,DBA应该根据实际情况,将该表访问权限授予相关用户,以便顺利出队该队列中的events信息。

      另外,友情提醒,默认情况下Scheduler仅保留最近24小时的Events信息,如果希望修改该设置的话,可以通过SET_SCHEDULER_ATTRIBUTE过程,修改scheduler的event_expiry_time属性,该项属性的属性值以秒为单位。

  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/forestwolf/p/5132255.html
Copyright © 2011-2022 走看看