标签:des style blog color io os ar for sp
说明:
1、为了测试方便,这里对存储过程的执行是模拟的
2、这里限制了并发执行存储过程的最大个数,但并没有对并发线程数进行控制,与文章标题略有不符,但程序稍做改动即可控制并发线程数
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OracleClient; using System.Diagnostics; using System.IO; using System.ServiceProcess; using System.Text; using System.Threading; using System.Timers; using System.Xml; using DBUtil; using FQDService.Utils; namespace FQDService { /// <summary> /// FQD服务 /// </summary> partial class FQDService : ServiceBase { #region 变量 /// <summary> /// 存储过程配置文档 /// </summary> public static XmlDocument doc; /// <summary> /// 执行存储过程线程数锁 /// </summary> public static Object lockTreadCount = new Object(); /// <summary> /// 执行存储过程超时时间 /// </summary> public static int timeout = 1000; /// <summary> /// 等待执行存储过程时间间隔 /// </summary> public static int interval = 100; /// <summary> /// 执行存储过程最大数 /// </summary> public static int maxRunProcCount = 5; /// <summary> /// 执行存储过程数 /// </summary> public static int runProcCount = 0; #endregion #region 构造函数 public FQDService() { InitializeComponent(); } #endregion #region 启动 protected override void OnStart(string[] args) { // TODO: 在此处添加代码以启动服务。 doc = XMLHelper.GetXmlDocument(); System.Timers.Timer timer = new System.Timers.Timer(60 * 1000); timer.Elapsed += new System.Timers.ElapsedEventHandler(RunProc); timer.Start(); } #endregion #region 结束 protected override void OnStop() { // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 } #endregion #region 执行存储过程 /// <summary> /// 执行存储过程 /// </summary> public void RunProc(object sender, ElapsedEventArgs e) { try { Random rnd = new Random(); XmlNode rootNode = doc.SelectSingleNode("settings"); foreach (XmlNode procNode in rootNode.ChildNodes) // 遍历Proc { string procName = procNode.SelectSingleNode("Name").InnerText.Trim(); string runTime = procNode.SelectSingleNode("RunTime").InnerText.Trim(); if (DateTime.Now.ToString("HH:mm") == "14:55") { bool finish = false; //存储过程是否执行完毕 Thread thread = null; thread = new Thread(new ParameterizedThreadStart(delegate(object obj) { #region 等待执行存储过程 lock (lockTreadCount) { while (runProcCount >= maxRunProcCount) { Thread.Sleep(interval); } runProcCount++; } #endregion #region 执行存储过程超时处理 Thread threadTimer = new Thread(new ParameterizedThreadStart(delegate(object obj2) { Thread.Sleep(timeout); if (finish == false) { FileLogger.WriteLog(string.Format("存储过程{0}执行超时", procName)); if (thread != null) { try { thread.Abort(); } catch (Exception ex) { FileLogger.WriteErrorLog(string.Format("存储过程{0}终止线程出错:{1}", procName, ex.Message)); } } } })); threadTimer.Start(); #endregion #region 为执行存储过程准备参数 XmlNodeList paramList = procNode.SelectSingleNode("Params").ChildNodes; OracleParameter[] oracleParams = new OracleParameter[paramList.Count]; for (int i = 0; i < paramList.Count; i++) // 遍历param { XmlNode paramNode = paramList[i]; string paramName = paramNode.SelectSingleNode("Name").InnerText.Trim(); string paramType = paramNode.SelectSingleNode("Type").InnerText.Trim(); string paramValue = paramNode.SelectSingleNode("Value").InnerText.Trim(); oracleParams[i] = new OracleParameter(paramName, Enum.Parse(typeof(OracleType), paramType)); if ((OracleType)Enum.Parse(typeof(OracleType), paramType) == OracleType.DateTime) { DateTime now = DateTime.Now; string[] paramValueArray = paramValue.Split(‘:‘); oracleParams[i].Value = new DateTime(now.Year, now.Month, now.Day, int.Parse(paramValueArray[0]), int.Parse(paramValueArray[1]), int.Parse(paramValueArray[2])); } else { oracleParams[i].Value = paramValue; } } #endregion try { try { #region 执行存储过程 FileLogger.WriteLog(string.Format("开始执行存储过程{0}", procName)); //执行存储过程 //OracleHelper.RunProcedure(procName, oracleParams); //模拟执行存储过程 Thread.Sleep(rnd.Next(100, 1900)); FileLogger.WriteLog(string.Format("存储过程{0}执行成功", procName)); finish = true; #endregion } catch (Exception ex) { #region 执行存储过程失败日志 StringBuilder sbParams = new StringBuilder(); foreach (OracleParameter oracleParam in oracleParams) { sbParams.Append(string.Format("{0}:{1},", oracleParam.ParameterName, oracleParam.Value.ToString())); } string strParams = ""; if (sbParams.Length > 0) strParams = sbParams.ToString(0, sbParams.Length - 1); FileLogger.WriteErrorLog(string.Format("存储过程执行失败{0}({1}):{2}", procName, strParams, ex.Message)); #endregion } } catch { //捕获线程终止异常 } finally { runProcCount--; } })); thread.Start(); } } } catch (Exception ex) { FileLogger.WriteErrorLog(ex.Message); } } #endregion } }
标签:des style blog color io os ar for sp
原文地址:http://www.cnblogs.com/s0611163/p/4028754.html