充值系统系统异常处理解决方案

事件由来,这段时间,接手公司充值系统,经过一段时间发现,由于供应商原因,经常会出现充值失败,而充值订单量很大,在短时间内就会出现大量客户投诉,而系统不能及时作出响应,前些天,我在修改充值系统时就在可能会出异常的地方,进行异常处理,并且把异常信息以邮件形式发送出来,这样技术人员就可以及时处理充值系统遇到了问题,这样又带来一个新的问题,异常邮件短时间内出现太多,影响了充值系统正常的邮件的发送。

 

首先看一下充值系统的架构情况,如下图所示

 

Top.WEB端供客户使用,通过T op.WCF把客户充值订单提交到Platform数据库里。

WIN Service每秒钟从Platform数据库订单查询出来,根据类型送到三家供应商去充值。

比如说,如果充值供应商1内部出现了问题,导致提交到充值供应商1的订单就不能充值成功,订单量很大的情况下,短时间内就出现了大量的异常邮件,而Mail Service由于充值供应商1的原因,其它供应商充值正常的邮件不能及时发送出来,比如供应商23充值失败,需要通知客服部门帮客户补充的订单不能及时发送给客服部门。

刚开始,其它同事也提到过,在Win Service程序里加个计数功能,突然出现大量异常情况就不再发送这种异常邮件了,这样也有问题,就是,这次不发送了,处理好了以后,再一次出现异常时还是要发送这种异常邮件的,当达到计数的限额以后就不再发送。达到这样的效果需要人工重启一下Win Service程序才可以。

下边我就想通过充值系统自身能实现异常邮件自动开关的功能,类图设计如下

 

 

AlertSwitch.Alert_TimePeriod 表示时间段,单位是分钟

AlertSwitch._Alert_Count 表示时间段内产生多少封邮件

AlertSwitch.Switch是开关,0表示开,1表示关

以上变量都是Static

AlertSwitch.OperAddAlert()方法,是往List<Alert>新增一条记录,并且当Alert_TimePeriod时间段内出现超过._Alert_Count数量的警报邮件时就把开关关掉,如果不就把开关开着,原代码如下

ExpandedBlockStart.gif 代码
   public   static   class  DFAlertSwitch
    {
        
public   static  List < DFAlert >  dfalert;
        
private   static   int  _Alert_TimePeriod  =  Settings.Default.Alert_TimePeriod; // 从配置文件中读取,默认为2
         private   static   int  _Alert_Count  =  Settings.Default.Alert_Count ;  // 从配置文件中读取,默认为20
         private   static   readonly  ILog DFSubmitLog  =  LogManager.GetLogger( " DFSubmitLog " );
        
// 开关 0 开,1 关
         public   static   int  Switch;
        
// public DFAlertSwitch()
        
// {
        
//     dfalert = new List<DFAlert>();
        
// }
         ///   <summary>
        
///  新增一条Alert,并且判断开关
        
///   </summary>
        
///   <param name="_dfalert"></param>
         public   static   void  AddAlert(DFAlert _dfalert)
        {
            
if  (dfalert  ==   null )
            {
                dfalert 
=   new  List < DFAlert > ();
            }
            DFSubmitLog.InfoFormat(
" head :  " ,_dfalert.AlertHead);
            DFSubmitLog.InfoFormat(
" Time :  " , _dfalert.AlertTime); 
            dfalert.Add(_dfalert);
            DFSubmitLog.Info(
" 已经添加 " );
            DFSubmitLog.InfoFormat(
" Count :  " , dfalert.Count); 
            
if  (dfalert.Count  >  _Alert_Count) // 当邮件超过20封时,开始判断
            {
                dfalert.RemoveAt(
0 ); // 把第一个移除
                 if  (dfalert[dfalert.Count - 1 ].AlertTime.AddMinutes( -  _Alert_TimePeriod)  <=  dfalert[ 0 ].AlertTime)   // 当前第20封邮件的时间 和第一封邮件的时间做比较
                {
                    
// 如果比较时间 在 2 分钟以内,说明 在2分钟内,突然产生了20封以上的邮件  这时候可能系统出现异常,不能再发警报邮件了
                    
// 把开关设置为关闭
                    Switch  =   1 ;
                    }
                
else
                {
                    Switch 
=   0 ;
                }
            }
        }


    }

    
public   class  DFAlert
    {
        
public   string  AlertHead
        {
            
get ;
            
set ;
        }
        
public  DateTime AlertTime
        {
            
get ;
            
set ;
        }
        
public  DFAlert( string  alerthead, DateTime alerttime)
        {
            AlertHead 
=  alerthead;
            AlertTime 
=  alerttime;
        }
    }

 

 

客户端调用示例程序如下

 

 DFAlert _dfalert  =   new  DFAlert( " 警报邮件 " , System.DateTime.Now);
 DFAlertSwitch.AddAlert(_dfalert);
 
if  (DFAlertSwitch.Switch  ==   1 )
 {
    
return ;   // 如果开关关掉,直接退出发邮件。
 }
 
else
 {
  
// nothing;
 }

 

 

转载于:https://www.cnblogs.com/zycblog/archive/2010/12/11/1903337.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值