首页 > 代码库 > NopCommerce的定时任务分析和应用

NopCommerce的定时任务分析和应用

NOP的定时任务也是群里听群友听说,我很少在WEB端做定时任务,所以尝鲜下,看看效果怎么样.

主要涉及到下面几个类和配置文件配置:

web.config

    <configSections>
        <section name="NopConfig" type="StudyCommerceTimerTask.TimerTask.NopConfig,StudyCommerceTimerTask" requirePermission="false"/> <!--请求权限,完全受控制-->
    </configSections>
    <connectionStrings>
        <add name="ConnectionString" connectionString="Data Source=10.1.0.103;Initial Catalog=DHGDP;uid=sa;pwd=dahua123"/>
    </connectionStrings>

    <NopConfig>
        <SqlServer ConnectionStringName="ConnectionString"/>
        <Cache Enabled="True"/>
        <ScheduleTasks>
            <!--1分钟执行一次-->
            <Thread seconds="60">
                <task name="AddDatabase" type="StudyCommerceTimerTask.TimerTask.ThreadTask.AddBase,StudyCommerceTimerTask" enabled="true" stopOnError="false"/>
            </Thread>
        </ScheduleTasks>
    </NopConfig>

其中NopConfig这个节点,里有很多配置。需要注意下:
1.SqlServer 是读取ConnectionString里面的配置链接字符串

2.Cache 是否开启缓存,开启就会从缓存读取,反之亦然

3.enabled是否对当前任务开启执行

4.stopOnError 是否遇见错误,还继续执行

从上面可以看出来,这个计划任务。一个线程可以执行多个任务。 可以执行多个线程。

ITask=>接口类:

这个是最重要的接口,所有的任务都通过实现这个接口,实现反转,开启任务执行。有点像IOC的味道

Task=>任务执行类

切记这个类不是对ITask类的实现类,而是对当前配置的节点的任务进行获取,并进行反射执行和调用里面配置的节点类进行执行任务

        public ITask createTask()
        {
            if (this.Enabled && (this._task == null))
            {
                if (this._taskType != null)
                {
                    this._task = Activator.CreateInstance(this._taskType) as ITask;
                }
            }
            return this._task;
        }

        public void Execute()
        {
            this._isRunning = true;
            try
            {
                var task = this.createTask();
                if (task != null)
                {
                    this._lastStarted = DateTime.Now;
                    task.Execute(this._configNode);
                    this._lastEnd = this._lastSuccess = DateTime.Now;
                }
            }
            catch (Exception exception)
            {
                this._enabled = !this.StopOnError;
                this._lastEnd = DateTime.Now;
                

                //throw;
            }
            this._isRunning = false;
        }

上面2个方法,一个是反射 一个是执行反射并更改当前线程任务在执行
TaskThread=>任务线程类

对配置的里面的所有任务加载到线程中,并开始执行

TaskManager=>任务线管理的任务管理

对当前所有的线程任务进行初始化加载和依次执行

Global.aspx.cs=>应用程序启动加载计划任务

        StudyCommerceTimerTask.TimerTask.NopConfig.Init();
            if (ConnectionIsSet())//如果数据库有链接配置
            {
                StudyCommerceTimerTask.TimerTask.TaskManager.Instance.Initialize(StudyCommerceTimerTask.TimerTask.NopConfig.ScheduleTasks);
                StudyCommerceTimerTask.TimerTask.TaskManager.Instance.Start();
            }
        /// <summary>
        /// 判断是否节点是否有链接字符串
        /// </summary>
        /// <returns></returns>
        public  static  bool ConnectionIsSet()
        {
            return !string.IsNullOrEmpty(StudyCommerceTimerTask.TimerTask.NopConfig.ConnectionString);
        }

我大致的了解就是,这个计划任务就是=>Nopconfig=>TaskManager=>TaskThread=>Task=>ITask=>实现的接口类

利用的是Timer这个计时器进行委托方法进行调用。

里面有3个要注意:

1.加载节点利用的是IConfigurationSectionHandler和ConfigurationManager.GetSection("NopConfig");

2.反射这个就不多说了 this._task = Activator.CreateInstance(this._taskType) as ITask;

3.Timer 计时器new Timer(new TimerCallback(TimerHandler),null,this.Interval,this.Interval);