以往的情況是邮件一提交到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
ADRRECYR
RECNO
MSGTP
REPEAT_CNT
WAIT_DATEWAIT_TIME
NEW_STATUS
SNDREQIMMEDIATLY
你可以通过SOOD和SOOS这2个表把所有信息都填入到内表中,那么就完成了重入队列的动作,当然只是完成了重入队列的动作,所以你还是需要执行第二步的动作(是否把IMMEDIATLY设为X,就可以立即发送还要测试,不过小fang一再告我不要把所有兔子都打光,谨记)。
通过以上的介绍,估计BW的邮件监控会是在你的掌控之中了。
<script type="text/javascript"></script>