首先的一个需求是在OA系统中定时跑一些定时作业,例如发放年假等事务,之前的做法是在服务器上加入一个服务,用系统定时作业去跑服务,这样有个问题就是当系统在发布的过程中,有可能忘记启动服务而导致无法定时执行。
在网上查了一下资料,这样的需求一般在全局application上做一定时器,定时执行任务。
MVC架构中Global.asax是指定路由的文件,而在里面定义了事件Application_Start和Application_End事件,这样可以在发布过后,直接启用定时器。

using System.Net;
using System.Threading;
using System.IO;
using System.Timers;
using System.Configuration;
using TajimaOA.UI.Common;

using TajimaOA.UI.OA;

//2014-03-14 add by WesChen 声明系统定时器
System.Timers.Timer MC_timer;
protected void Application_Start()
        {
            //系统是否允许计时器运行
            string l_SystemAllowTimer = System.Web.Configuration.WebConfigurationManager.AppSettings["TajimaAllowWorkTimer"];
            if (l_SystemAllowTimer == "Y")
            {
                //计时器运行间隔时间
                int l_TimerInterval = Convert.ToInt32(System.Web.Configuration.WebConfigurationManager.AppSettings["TajimaAllowTimerInterval"]);
 
                MC_timer = new System.Timers.Timer(l_TimerInterval);
                MC_timer.Elapsed += new ElapsedEventHandler(SystemExeTimerConsole);
                MC_timer.Start();
 
            }
 
            AreaRegistration.RegisterAllAreas();
 
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

}

///-------------------------------------------------

protected void Application_End()
        {
            EndSystemTimer();
 
            //定时器运行地址,方便IIS重启时可以恢复作业运行
            string url = System.Web.Configuration.WebConfigurationManager.AppSettings["TajimaTimerRunPath"];
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流

}  
///-------------------------------------------------

private static void SystemExeTimerConsole(object sender, System.Timers.ElapsedEventArgs e)
        {            
            TajimaOA.UI.Controllers.SystemManagerController l_SystemManagerController = new Controllers.SystemManagerController();
            l_SystemManagerController.SystemRunTimer(System.DateTime.Now);
            //该方法为作业池的入口,传入当前调用时间,调用在这个时间段需要执行的作业,作业运行过后,再计算下次调用时间,如此反复 


///-------------------------------------------------

        private static void EndSystemTimer()
        {
            TajimaOA.UI.Controllers.SystemManagerController l_SystemManagerController = new Controllers.SystemManagerController();
            l_SystemManagerController.EndSystemTimer();



//****************************************************************************

#region 2014-03-14 add by WesChen 系统作业池功能
 
        private static string MC_SystemTimerCode = "TajimaTimer";//固定编号
 
        /// <summary>
        /// 2014-03-14 add by WesChen 
        /// 计时器运行作业池
        /// </summary>
        /// <param name="pi_RunTime">系统运行时间</param>
        public void SystemRunTimer(DateTime pi_RunTime)
        {
 
            try
            {
                //运行作业池
                SystemJobRuning(pi_RunTime);
 
                //计定时器运行状态
                StartSystemTimer(pi_RunTime);
            }
            catch (Exception)
            {
                EndSystemTimer();
            }
 
            
        }
 
        public JsonResult SystemRunTimer()
        {
            JsonResultBase result = new JsonResultBase();
            result.success = true;
 
            try
            {
                StartSystemTimer(System.DateTime.Now);
            }
            catch (Exception)
            {
                result.success = false;                
            }            
            return Json(result, JsonRequestBehavior.AllowGet);
        }
 
        /// <summary>
        /// 2014-03-14 add by WesChen
        /// 运行定时器
        /// </summary>
        /// <param name="pi_StartTime"></param>
        public void StartSystemTimer(DateTime pi_StartTime)
        {
 
            SystemManageServiceClient l_ServiceClient=new SystemManageServiceClient();
            SystemTimerSettingEntity l_data = l_ServiceClient.GetSystemTimerSettingByCode(MC_SystemTimerCode);
 
            //正在运行
            l_data.IsRuning = "Y";
            //最后运行时间
            l_data.LastRuningDateTime = pi_StartTime;
 
            //保存
            l_ServiceClient.UpdateSystemTimerSetting(l_data);
        }
 
        /// <summary>
        /// 2014-03-14 add by WesChen
        /// 结束定时器
        /// </summary>
        /// <param name="pi_EndTime"></param>
        public void EndSystemTimer()
        {
            SystemManageServiceClient l_ServiceClient = new SystemManageServiceClient();
            SystemTimerSettingEntity l_data = l_ServiceClient.GetSystemTimerSettingByCode(MC_SystemTimerCode);
 
            //正在运行
            l_data.IsRuning = "N";            
 
            //保存
            l_ServiceClient.UpdateSystemTimerSetting(l_data);
        }
 
        /// <summary>
        /// 2014-03-19 add by WesChen 
        /// 获取系统定时器状态
        /// </summary>
        /// <returns></returns>
        public JsonResult GetSystemTimerState()
        {
            SystemManageServiceClient l_ServiceClient = new SystemManageServiceClient();
            SystemTimerSettingEntity l_data = l_ServiceClient.GetSystemTimerSettingByCode(MC_SystemTimerCode);
            return Json(l_data, JsonRequestBehavior.AllowGet);
        }
 

#endregion

//*************************************************************************************

public void SystemJobRuning(DateTime pi_JobDateTime)
        {
            SystemManageServiceClient serviceClient = new SystemManageServiceClient();
 
            //iDisplayLength,iDisplayStart,sEcho,iTotalDisplayRecords
 
            SearchParamEntity searchParam = new SearchParamEntity();
            int totalCount = 0;
            int currentPage = 1;
            int pageSize = 999999;            
 
            SystemJobSettingEntity[] l_SystemJobSettingList = serviceClient.GetSystemJobSettingList(out totalCount, searchParam, currentPage, pageSize);
 
            for (int i = 0; i < l_SystemJobSettingList.Length; i++)
            {
                //有效
                if (l_SystemJobSettingList[i].IsWork.ToUpper() == "Y")
                {
                    if (l_SystemJobSettingList[i].NextWorkTime.Value.Date == pi_JobDateTime.Date && l_SystemJobSettingList[i].NextWorkTime.Value.Hour == pi_JobDateTime.Hour && l_SystemJobSettingList[i].NextWorkTime.Value.Minute == pi_JobDateTime.Minute)
                    {
                        try
                        {
                            string url = l_SystemJobSettingList[i].JobRunUrl;
                            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                            Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
 
 
                            UpdateSystemJobSettingNextWorkTime(new Guid(l_SystemJobSettingList[i].ID.ToString()));
 
 
                            OA.SystemManageService.SystemOperateLogEntity data = new OA.SystemManageService.SystemOperateLogEntity();
                            data.ID = Guid.NewGuid();
                            data.OperateType = "SystemJobRunLog";
                            data.OperateDesc = "Tajima作业操作-" + l_SystemJobSettingList[i].JobName;
                            data.OperatorUserID = new Guid("00000000-0000-0000-0000-000000000000");
                            data.Remark = "系统作业-" + l_SystemJobSettingList[i].JobName + "在" + pi_JobDateTime.ToString("yyyy-MM-dd HH:mm:ss") + "运行成功。";
                            OA.SystemManageService.SystemManageServiceClient systemManageServiceClient = new OA.SystemManageService.SystemManageServiceClient();
                            systemManageServiceClient.AddOperateLog(data);
 
                        }
                        catch (Exception)
                        {
                            OA.SystemManageService.SystemOperateLogEntity data = new OA.SystemManageService.SystemOperateLogEntity();
                            data.ID = Guid.NewGuid();
                            data.OperateType = "SystemJobRunError";
                            data.OperateDesc = "Tajima作业操作-" + l_SystemJobSettingList[i].JobName;
                            data.OperatorUserID = new Guid("00000000-0000-0000-0000-000000000000");
                            data.Remark = "系统作业-" + l_SystemJobSettingList[i].JobName + "在" + pi_JobDateTime.ToString("yyyy-MM-dd HH:mm:ss") + "运行未能成功。";
                            OA.SystemManageService.SystemManageServiceClient systemManageServiceClient = new OA.SystemManageService.SystemManageServiceClient();
                            systemManageServiceClient.AddOperateLog(data);
                        }
 
                    }
                }
            }
 



//***********************************************************************************

public void UpdateSystemJobSettingNextWorkTime(Guid id)
        {
            OA.SystemManageService.SystemManageServiceClient l_SystemManageService = new OA.SystemManageService.SystemManageServiceClient();
            SystemJobSettingEntity l_data = l_SystemManageService.GetSystemJobSettingByID(id);
 
            if (l_data.IntervalType.ToUpper() == "ONCE")
            {
                #region 全局运行一次
                l_data.IsWork = "N";
                l_data.LoseEfficacyDateTime = System.DateTime.Now;
 
                //修改作业
                l_SystemManageService.UpdateSystemJobSetting(l_data);
 
                #endregion
            }
            else if (l_data.IntervalType.ToUpper() == "REPEAT")
            {
                #region 多次运行
                if (l_data.EndDate.Trim() == "")
                {
                    #region 无结束日期
                    if (l_data.RunCount.ToUpper() == "ONLYONE")
                    {
                        #region 重复一次、下次为加一天
                        l_data.NextWorkTime = l_data.NextWorkTime.Value.AddDays(1);
                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                        #endregion
                    }
                    else if (l_data.RunCount.ToUpper() == "RUNMANY")
                    {
                        if (l_data.RunIntervalUnit.ToUpper() == "HOUR")
                        {
                            if (l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                            {
                                l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                l_SystemManageService.UpdateSystemJobSetting(l_data);
                            }
                            else
                            {
                                l_data.NextWorkTime = l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount));
                                l_SystemManageService.UpdateSystemJobSetting(l_data);
                            }
                        }
                        else
                        {
                            if (l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                            {
                                l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                l_SystemManageService.UpdateSystemJobSetting(l_data);
                            }
                            else
                            {
                                l_data.NextWorkTime = l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount));
                                l_SystemManageService.UpdateSystemJobSetting(l_data);
                            }
                        }
                    }
                    #endregion
                }
                else
                {
                    #region 指定结束日期
                    if (Convert.ToDateTime(l_data.EndDate).Date > System.DateTime.Now.Date)
                    {
                        #region 未到最后日期
                        if (l_data.RunCount.ToUpper() == "ONLYONE")
                        {
                            #region 重复一次、下次为加一天
                            l_data.NextWorkTime = l_data.NextWorkTime.Value.AddDays(1);
                            l_SystemManageService.UpdateSystemJobSetting(l_data);
                            #endregion
                        }
                        else if (l_data.RunCount.ToUpper() == "RUNMANY")
                        {
                            #region 多次
                            if (l_data.RunIntervalUnit.ToUpper() == "HOUR")
                            {
                                if (l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                                {
                                    l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                    l_SystemManageService.UpdateSystemJobSetting(l_data);
                                }
                                else
                                {
                                    l_data.NextWorkTime = l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount));
                                    l_SystemManageService.UpdateSystemJobSetting(l_data);
                                }
                            }
                            else
                            {
                                if (l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                                {
                                    l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                    l_SystemManageService.UpdateSystemJobSetting(l_data);
                                }
                                else
                                {
                                    l_data.NextWorkTime = l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount));
                                    l_SystemManageService.UpdateSystemJobSetting(l_data);
                                }
                            }
                            #endregion
                        }
                        #endregion
                    }
                    if (Convert.ToDateTime(l_data.EndDate).Date == System.DateTime.Now.Date)
                    {
                        #region 等于最后日期
                        if (Convert.ToDateTime(l_data.EndTime).TimeOfDay > System.DateTime.Now.TimeOfDay)
                        {
                            #region 当前时间小于最后运行时间
                            if (l_data.RunCount.ToUpper() == "ONLYONE")
                            {
                                #region 重复一次、下次为加一天
                                l_data.NextWorkTime = l_data.NextWorkTime.Value.AddDays(1);
                                l_SystemManageService.UpdateSystemJobSetting(l_data);
                                #endregion
                            }
                            else if (l_data.RunCount.ToUpper() == "RUNMANY")
                            {
                                #region 多次
                                if (l_data.RunIntervalUnit.ToUpper() == "HOUR")
                                {
                                    if (l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                                    {
                                        l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                                    }
                                    else
                                    {
                                        l_data.NextWorkTime = l_data.NextWorkTime.Value.AddHours(Convert.ToInt32(l_data.RunIntervalCount));
                                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                                    }
                                }
                                else
                                {
                                    if (l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount)).TimeOfDay > Convert.ToDateTime(l_data.EndTime).TimeOfDay)
                                    {
                                        l_data.NextWorkTime = new DateTime(Convert.ToDateTime(l_data.NextWorkTime).Year, Convert.ToDateTime(l_data.NextWorkTime).Month, Convert.ToDateTime(l_data.NextWorkTime).Day, Convert.ToDateTime(l_data.StartTime).Hour, Convert.ToDateTime(l_data.StartTime).Minute, 0).AddDays(1);
                                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                                    }
                                    else
                                    {
                                        l_data.NextWorkTime = l_data.NextWorkTime.Value.AddMinutes(Convert.ToInt32(l_data.RunIntervalCount));
                                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                                    }
                                }
                                #endregion
                            }
                            #endregion
                        }
                        else
                        {
                            #region 日期相等、时间大于或等于最后运行时间
                            l_data.IsWork = "N";
                            l_SystemManageService.UpdateSystemJobSetting(l_data);
                            #endregion
                        }
                        #endregion
                    }
                    else
                    {
                        #region 超过最后日期
                        l_data.IsWork = "N";
                        l_SystemManageService.UpdateSystemJobSetting(l_data);
                        #endregion
                    }
                    #endregion
                }
                #endregion
            }
 

}

.net MVC全局定时器执行作业的更多相关文章

  1. Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...

  2. Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  3. ASP.NET MVC应用程序执行过程分析

    ASP.NET MVC应用程序执行过程分析 2009-08-14 17:57 朱先忠 朱先忠的博客 字号:T | T   ASP.NET MVC框架提供了支持Visual Studio的工程模板.本文 ...

  4. 【转】 实现 Cocos2d-x 全局定时器

    转自:http://www.tairan.com/archives/3998 cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期 ...

  5. 解说asp.net core MVC 过滤器的执行顺序

    asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...

  6. AlarmManager(全局定时器/闹钟)详解

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.指定时长或以周期形式执行某项操作.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的 ...

  7. .NET MVC全局异常处理(一)

    目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...

  8. MVC 全局拦截aciton

    上篇:MVC 拦截指定的action 有时,我们需要对所有aciton在执行前/后做一些(预)处理,如何实现呢? 1.定义一个action筛选类.继承至System.Web.Mvc.IActionFi ...

  9. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

随机推荐

  1. D3D游戏编程系列(一):DXLib的介绍

    这篇文章里我准备向大家介绍下我封装的一个基础D3D库:DXLib.有了这样一个类库,可以减少很多无用功以及繁琐的工作,使我们的效率大大提高. DXLib.h #define DIRECTINPUT_V ...

  2. nyist 737 相邻石子合并问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=737 动态规划状态方程: dp[i][j]=d[i][k]+dp[k+1][j]+(sum[k]-s ...

  3. DOM4J介绍与代码示例【转载】

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...

  4. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  5. hdu4619Warm up 2

    http://acm.hdu.edu.cn/showproblem.php?pid=4619 二分图匹配  最小点覆盖 = 最大匹配 #include <iostream> #includ ...

  6. bzoj题解

    bzoj1012 线段树水题 bzoj1207 LIS水题 bzoj2190 挡住,即 bzoj1601 已被删除的水题? bzoj1607 线段树细节题,搞清楚特判即可 bzoj1008 快速幂妥妥 ...

  7. CodeForces Round #285 Div.2

    C.Misha and Forest (图论 BFS) 比赛进行了一半才想起来有场CF没打,=_=|| 前两道题快速切掉,C题一直卡没什么好的思路 憋了几天,忍不住偷偷瞄了一下别人AC的代码,发现我题 ...

  8. Azure 中的多个 VM NIC 和网络虚拟设备

    YU-SHUN WANG Azure 网络高级项目经理 在 2014 年欧洲 TechEd 大会上,我们宣布了在Azure VM 中为多个网络接口 (NIC) 提供支持,并与多家重要厂商合作,在 Az ...

  9. apache开源项目--solr

    solr 名称来源 Search On Lucene Replication solr 基本概况 Apache Solr (读音: SOLer) 是一个开源的搜索服务器.Solr 使用 Java 语言 ...

  10. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...