|
<job singleThread = "false" minutes = "5" name = "Emails" type = "CommunityServer.Components.EmailJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" failureInterval = "1" numberOfTries = "10" />
singleThread:当头CS版本中没有用到。
Minutes:执行回调函数TimerCallback的时间与时间间隔,这里是5分钟。
name:该Job的唯一标识。
type:该Job所在的名字空间,逗号后面的是该Job所在的程序集dll文件名称。
enabled:如果为“false”该Job会被关闭,也就是不会实例化一个定时器。“true”则为开启该Job。
enableShutDown:这个有点意思,用途是当该Job在执行Execute时,如果长生异常是否关闭这个Job,也就是说是否还允许它再次运行。“false”表示允许,“true”表示不允许。
failureInterval:如果发送邮件失败,与下次尝试再次发送的时间间隔,单位是分钟。
numberOfTries:如果发送邮件失败,该Job会尝试几次,这里是10次。
现在回到我们开始时候在CSHttpModule.cs中看到的这句:
Jobs.Instance().Start();
首先调用Jobs,实例化一个Jobs类,这个类在CS中有且只有一个实例。之后调用Jobs中的Start()方法。Jobs为了确保系统的安全,在开始之前先调用Stop(),现释放之前为Job实例化的非托管资源(其实就是调用Timer与Job下面的Dispose方法,这也是为什么Job要实现IDispose接口的原因,是想一下,如果前一次定义的定时器没有被释放,然后又接着实例化一个,然后这样多重复几次...哈哈,你的CS就会有N个线程在跑,服务器很快就会挂掉的)。
释放完资源后(无论有没有CS都会这么做),接着就会实例化每个实现了IJob的类,根据上述的配置文件定义一个Timer或者让每个Job都定义一个自己的Timer(这就相当于给钟点工统一一个工作时间或者给每个钟点工都规定一个工作时间,规定完后该干什么的就干去吧,只要时间到了就得干活)。再往下,就自己分析吧,也就没有什么难题了…
不知道为什么我的团队中的几个成员老是不能理解这个执行过程,我解释了半天,最后发现了问题:
回到CSHttpModule.cs文件中来,这是一个实现了IHttpModule接口的类,实现该接口的类都要有一个Init方法,我们看到,所有的Job开始初始化的起点也是从这个方法中调用的。但是我的小组成员都认为每个Http请求都会调用一次Init方法,
public void Init(HttpApplication application)
{
// Wire-up application events
//
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
application.AuthenticateRequest += new EventHandler(Application_AuthenticateRequest);
application.Error += new EventHandler(this.Application_OnError);
application.AuthorizeRequest += new EventHandler(this.Application_AuthorizeRequest);
//settingsID = SiteSettingsManager.GetSiteSettings(application.Context).SettingsID;
上一篇:Community Server专题六:Delegates & Events
下一篇:Community Server专题八:MemberRole之Membership
|