以往的情況是邮件一提交到BW的邮件队列我们就认为自己工作做完了。事实上却没有,并且我们一直被困惑着,因为邮件会错、会拖、会等、会卡,所有小孩子会犯的错,它都会,而我们却不知道为什么。 我们的规划是能够把邮件的发送纳入到可控范围,可以知道有没有错误,有没有发送,有没有等待。 我们在规划时,分了几个步骤去实现: 1. 可以监控邮件系统是否存在等待状况 2. 如果存在等待状况,能够自动触发邮件发送动作 3. 可以监控邮件系统是否存在异常邮件 4. 如果存在异常邮件,能够自动触发重发邮件动作 通过对邮件系统的数据日志分析,我们找到了其中的对应关系。邮件系统会把目前处于等待状态的邮件暂时性的存储到SOST这个表中,在联合SOOD这个存储邮件基本信息的表,我们很快就是实现了第一步。建立如下试图: Tables: SOOD SOSC Join conditions: SOOD MANDT = SOSC MANDT SOOD OBJTP = SOSC OBJTP SOOD OBJYR = SOSC OBJYR SOOD OBJNO = SOSC OBJNO View Fields: SOOD OBJNO SOOD OBJNAM SOOD OBJDES SOOD CRDAT SOOD CRTIM SOOD OBJSND SOOD SDDAT SOOD SDTIM SOSC ENTRY_DATE SOSC ENTRY_TIME SOSC SNDPRI SOSC STATUS SOSC NEW_STATUS 那么我們可以通過查询试图获得目前邮件等待情况。 我们知道可以手动去发送等待状态的邮件,但是我们的目的是能够让系统自动做,所以我们找到了相应的Report:RSCONN01(至于如何找到程序,通过SDN和Debug就八九不离十了)。一定发现有等待的邮件,且邮件是我们需要监控的,那么就让程序去触发邮件发送动作。这样我们又解决了第二个问题。 第三步比较简单,因为判断是否错误无非是判断Log的状态信息,但是问题是我们获得的状态编号是否就涵盖了所有情况,也没有这样的文档说明。所以我们罗列的历史以来日志出现的状态编号,比较笨,但是不得不说我们做到了。 第四步的实现也是通过Debug程序找到的,Function:SO_SEND_PROCESS_REQUEUE。 这里有心的可能会发出这样的疑问,为什么不用第二步的程序。原因是,第二步的程序只会把目前处于等待状态的邮件重发,而邮件一旦异常,那么邮件系统就会把这些邮件踢到非等待状态,所以第二步出现的程序根本就碰不到这个异常邮件,所以也谈不上用它来发送了。这个Function会通过一个table存储需要重发的邮件,所以我们要做的就是把邮件信息重新放进去。 内表的格式如下:[加粗的是必填] OBJTP OBJYR OBJNO FORTP FORYR FORNO RECTP ADR RECYR RECNO MSGTP REPEAT_CNT WAIT_DATE WAIT_TIME NEW_STATUS SNDREQ IMMEDIATLY 你可以通过SOOD和SOOS这2个表把所有信息都填入到内表中,那么就完成了重入队列的动作,当然只是完成了重入队列的动作,所以你还是需要执行第二步的动作(是否把IMMEDIATLY设为X,就可以立即发送还要测试,不过小fang一再告我不要把所有兔子都打光,谨记)。 通过以上的介绍,估计BW的邮件监控会是在你的掌控
|