首先的一个需求是在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
}
}
- Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
- ASP.NET MVC应用程序执行过程分析
ASP.NET MVC应用程序执行过程分析 2009-08-14 17:57 朱先忠 朱先忠的博客 字号:T | T ASP.NET MVC框架提供了支持Visual Studio的工程模板.本文 ...
- 【转】 实现 Cocos2d-x 全局定时器
转自:http://www.tairan.com/archives/3998 cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期 ...
- 解说asp.net core MVC 过滤器的执行顺序
asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...
- AlarmManager(全局定时器/闹钟)详解
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.指定时长或以周期形式执行某项操作.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的 ...
- .NET MVC全局异常处理(一)
目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...
- MVC 全局拦截aciton
上篇:MVC 拦截指定的action 有时,我们需要对所有aciton在执行前/后做一些(预)处理,如何实现呢? 1.定义一个action筛选类.继承至System.Web.Mvc.IActionFi ...
- 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有相关 ...
随机推荐
- 解决 Your project contains error(s),please fix them before running your application问题
原文地址: Android笔记:解决 Your project contains error(s),please fix them before running your application问题 ...
- POJ1850——Code(组合数学)
Code DescriptionTransmitting and memorizing information is a task that requires different coding sys ...
- 学Android开发 这19个开发工具助你顺风顺水
学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小 ...
- poj 2996 Help Me with the Game(模拟)
题目:http://poj.org/problem?id=2996 题意:给出 棋盘 情况 输出 白棋 和 黑棋在 棋盘上的 白棋为大写字母 黑棋为小写字母 棋盘 左下点为原点(1,a) 输出 是 按 ...
- sharedevelop iis express
sharedevelop 的IIS express的配置文件在 %userprofile%\documents\IISExpress\config\applicationhost.config 自动会 ...
- JAVA分布式事务原理及应用
JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目的是要 ...
- centos 6.5 32位 编译安装Mysql
groupadd mysql #添加mysql组 useradd -g mysql mysql -s /bin/false #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统 ...
- (转)innodb 与 myisam 读写性能分析
前提: mysql在5.0之前,读写性能相差很大,读性能:myisam 很强 mysql在5.0之后,差距不是很大 http://passover.blog.51cto.com/2431658/507 ...
- delphi 数据导出到word
procedure TFrmWeekAnalysisQry.BtnExportToExcelClick(Sender: TObject);var wordApp,WordDoc,WrdSelectio ...
- Zabbix探索:Discovery任务、进程以及占用率
刚刚又报错了,如下所示: Zabbix discoverer processes more than 75% busy 原因是,我配置了一个自动发现的任务.而每个自动发现的任务都会在一定时间内占用一个 ...