脚本绑定回调增强版:备用url可以失败重试

原文 http://www.blogjava.net/emu/archive/2011/07/19/354660.html

4年前写过一篇《脚本绑定回调》 http://www.blogjava.net/emu/articles/129240.html 进行了一些有趣的尝试,这些尝试现在在一些web产品中已经应用了好几年了。这两年随着海外用户的增多,用户情况的复杂化,我们的服务部署也开始复杂化了,有一些用户访问A域名失败,访问B域名就可能很畅顺,另一些用户则相反。而且很多时候这并不是gslb这样的调度可以及时检测到和快速调整的,不由得想想,能不能进行失败重试呢?其实也很简单把4年前的代码改了一改,做了一个原理性的实验:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
var isIE = !!window.ActiveXObject;
var useFragment=false;
function loadjs(url,callback,errcallback,url2,url3){
    if(isIE){
        if(useFragment){
           var df = document.createDocumentFragment();    
            df.visitCountCallBack = function(data){
                s.onreadystatechange=null;
                df=null;
                callback(data);
            }
            var s = df.createElement("SCRIPT");
            df.appendChild(s);
            s.onreadystatechange=function (ec,cb,u2,u3){
                return function(){
                    if(s.readyState=="loaded") {
                        s.onreadystatechange=null;
                        df=null;
                        if(!u2){
                            ec();
                        }else{
                            loadjs(u2,cb,ec,u3)
                        }
                    }
                }
            }(errcallback,callback,url2,url3)
            s.src = url;
        }else{
            var i=new ActiveXObject("htmlfile");
            i.open();
            i.parentWindow.visitCountCallBack=function(i){
                return function(d){
                    i.parentWindow.errcallback=null;
                    i=null;
                    callback(d);
                }
            }(i);
            i.parentWindow.errcallback=function(ec,cb,u2,u3){
                return function(){
                    i.parentWindow.errcallback=null;
                    i=null;
                    if(!u2){
                        ec();
                    }else{
                        loadjs(u2,cb,ec,u3)
                    }
                }
            }(errcallback,callback,url2,url3)
            i.write("<script src=\""+url+"\"><\/script><script defer>setTimeout(\"errcallback()\",0)<\/script>")
            if(i)i.close();//如果数据被cache,运行到这一行的时候有可能回调已经完成,窗口已经关闭。
        }
    }else{
        var i = document.createElement("IFRAME");    
        i.style.display="none";
        i.callback=function(o){
            callback(o);
            i.contentWindow.callback=null;
            i.src="about:blank"
            i.parentNode.removeChild(i);
            i = null;
        };
        i.errcallback = function(ec,cb,u2,u3){
            return function(){
                    if(!u2){
                        ec();
                    }else{
                        loadjs(u2,cb,ec,u3)
                    }
            }
        }(errcallback,callback,url2,url3);
        i.src="javascript:\"<script>function visitCountCallBack(data){frameElement.callback(data)};<\/script><script src='"+url+"'><\/script><script>setTimeout('frameElement.errcallback()',0)<\/script>\"";
        document.body.appendChild(i);
    }
}

function init(){
    var spans = document.getElementsByTagName("span");
    for(var i=0;i<spans.length;i++){
        var id = spans[i].id;
        var url = "http://g.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=a"+id;//故意制造错误引发重试
        var url2 = "http://g.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=b"+id;//故意再次制造错误引发重试
        var url3 = "http://g.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin="+id;
        var callback = function(id){ return function(data){
            document.getElementById(id).innerHTML = data.visitcount;
            }
        }(id);
        var errcallback = function(id){ return function(){
            document.getElementById(id).innerHTML = "无法连接到服务器";
            }
        }(id);
        loadjs(url,callback,errcallback,url2,url3);
    }
}
</SCRIPT>
</HEAD>
<BODY οnlοad="init()">
12345(非法帐号)的访问量:<span id="12345"></span><BR>
123456 的访问量:<span id="123456"></span><BR>
20050606 的访问量:<span id="20050606"></span><BR>
</BODY>
</HTML>


故意在前两次请求中制造了错误,尝试到第三个url的时候才成功。

以下是一个示例脚本,用于发送邮件并实现失败重试: ```python import smtplib import time MAX_RETRIES = 5 # 最大重试次数 SMTP_SERVER = 'smtp.gmail.com' SMTP_PORT = 587 SENDER_EMAIL = 'sender@gmail.com' SENDER_PASSWORD = 'password' RECEIVER_EMAIL = 'receiver@gmail.com' def send_email(subject, message): retries = 0 while retries < MAX_RETRIES: try: server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() server.login(SENDER_EMAIL, SENDER_PASSWORD) server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, f'Subject: {subject}\n\n{message}') server.quit() print('邮件发送成功!') return True except Exception as e: print(f'邮件发送失败:{e}') retries += 1 print(f'等待{retries}秒后重试...') time.sleep(retries) print('重试次数已达到上限,邮件发送失败。') return False if __name__ == '__main__': subject = '测试邮件' message = '这是一封测试邮件。' send_email(subject, message) ``` 该脚本将尝试发送邮件,并在失败时进行重试,最多重试五次。如果所有重试失败,它将打印一条消息并返回 False。 在 `send_email` 函数中,我们使用一个 while 循环来重试发送邮件,直到达到最大重试次数或邮件发送成功。在每次重试之前,我们使用 `time.sleep()` 函数等待一段时间,以避免过度占用资源。如果邮件发送成功,函数将返回 True。 请注意,这仅是一个简单的示例脚本,您可能需要根据自己的需求进行修改和扩展。例如,您可以将 MAX_RETRIES、SMTP_SERVER、SENDER_EMAIL、SENDER_PASSWORD 和 RECEIVER_EMAIL 替换为您自己的值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值