zoukankan      html  css  js  c++  java
  • 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);

    源代码下载:

    StudyCommerceTimerTask.zip

  • 相关阅读:
    【小贴士】zepto find元素以及ios弹出键盘可能让你很头疼
    【iScroll源码学习04】分离IScroll核心
    【iScroll源码学习03】iScroll事件机制与滚动条的实现
    展望14,献给困惑的初级前端,理想不甘消磨,目标不能停滞!
    【iScroll源码学习02】分解iScroll三个核心事件点
    原生andriod浏览器回退后dom(click)事件全体失效问题探究
    【iScroll源码学习01】准备阶段
    【iScroll源码学习00】模拟iScroll
    【再探backbone 03】博客园单页应用实例(提供源码)
    【再探backbone 02】集合-Collection
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/3712220.html
Copyright © 2011-2022 走看看