From b0c18d369abd06075c83759b0e19823c2a11d716 Mon Sep 17 00:00:00 2001 From: ulysseskao <ulysseskao@gmail.com> Date: Fri, 29 Apr 2016 18:45:41 +0800 Subject: [PATCH] update for new model --- CCSTrace/CCS/CCSMain.cs | 419 ++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 224 insertions(+), 195 deletions(-) diff --git a/CCSTrace/CCS/CCSMain.cs b/CCSTrace/CCS/CCSMain.cs index 56a0dbb..c824a21 100644 --- a/CCSTrace/CCS/CCSMain.cs +++ b/CCSTrace/CCS/CCSMain.cs @@ -1,162 +1,174 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.Data; -using System.Configuration; -using System.Web; -using System.Web.Security; -using System.Web.UI; -using System.Web.UI.HtmlControls; -using System.Web.UI.WebControls; -using System.Web.UI.WebControls.WebParts; -using System.Xml; +using System.Data.OracleClient; +using System.IO; using System.Runtime.CompilerServices; using System.Threading; - +using System.Web; +using System.Xml; +using Amib.Threading; +using CCSTrace.CCS.Domain; +using CCSTrace.CCS.Object; +using NLog; namespace CCSTrace.CCS { - public class CCSMain + public class CcsMain { - private static CCSMain _instance; - public static CCS.Object.CCSCodelist CCSCodelist; - public static CCS.Object.EOSCodelist EOSCodelist; - public static System.Collections.ArrayList DBConnList = new System.Collections.ArrayList(); - public static System.Collections.ArrayList ProcessCases = new System.Collections.ArrayList(); + private const string DbConfigFilename = "DBConfig.xml"; - private string LoadFilename = "DBConfig.xml"; - private string ConnectionString = String.Empty; - private string traceConnectionString = String.Empty; - private int ConnectionCount = 1; - public static System.Data.OracleClient.OracleConnection MainConn = null; - static SEventLog _MainLog = null; + private static Logger _logger = LogManager.GetCurrentClassLogger(); + private static CcsMain _instance; - public static System.Collections.Hashtable ProcessFDR = new System.Collections.Hashtable();//Record the processing FDR - public static System.Collections.ArrayList WaitingCases = new System.Collections.ArrayList();//Record the case when the case's FDR processed by another + public static ArrayList ProcessCases = new ArrayList(); + public static Queue<int> ProcessCaseQueue = new Queue<int>(); + public static Hashtable ProcessFdr = new Hashtable();//Record the processing FDR + public static ArrayList WaitingCases = new ArrayList();//Record the case when the case's FDR processed by another - public CCSMain() + private int _connectionCount = 1; + private OracleConnection _mainConn = null; + private SEventLog _mainLog = null; + + private SmartThreadPool _mainjobThreadPool = null; + private readonly object _syncDbQueue = new object(); + private readonly Queue<OracleConnection> _dbQueue = new Queue<OracleConnection>(); + + public CcsMain() { - Initial(); + _mainjobThreadPool = new SmartThreadPool(); + // Startup(); } - public static CCSMain Instance() - { + public string AppDataPath { get; set; } + public static CcsMain Instance() + { // Uses lazy initialization. // Note: this is not thread safe. if (_instance == null) { - _instance = new CCSMain(); - + _instance = new CcsMain(); } return _instance; - } - private void Initial() + public void Startup() { - _MainLog = new SEventLog(); + _mainLog = new SEventLog(); try { - ReadXML(); + ReadXml(); - if (MainConn == null) - MainConn = CreateConnection(); - //MainConn = CreateMainConnection(); + if (_mainConn == null) + _mainConn = CreateConnection(); + //MainConn = CreateMainConnection(); - CCSCodelist = new CCSTrace.CCS.Object.CCSCodelist(MainConn); - EOSCodelist = new CCSTrace.CCS.Object.EOSCodelist(MainConn); + GlobalVariable.CcsCodelist = new CcsCodelist(_mainConn); + GlobalVariable.EosCodelist = new EosCodelist(_mainConn); - for (int i = 0; i < ConnectionCount; i++) - DBConnList.Add(CreateConnection()); + for (int i = 0; i < _connectionCount; i++) + { + lock (_syncDbQueue) _dbQueue.Enqueue(CreateConnection()); + } } - catch(Exception e) + catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); - _MainLog.Error(e.Message); + _mainLog.Error(e.Message); - if (LocalVariable.ShowError) - _MainLog.Error(e.StackTrace); + if (GlobalVariable.ShowError) + _mainLog.Error(e.StackTrace); - throw e; + throw; } finally { - _MainLog.Close(); + _mainLog.Close(); } - Object.CCSRecord m_Record = getWaitRecord(); + CcsRecord mRecord = GetWaitRecord(_mainConn); - if (m_Record != null) + if (mRecord != null) { - System.Data.OracleClient.OracleConnection _Conn = (System.Data.OracleClient.OracleConnection)DBConnList[0]; - DBConnList.Remove(_Conn); - - ProcessCase(m_Record, _Conn); + OracleConnection conn = null; + lock (_syncDbQueue) conn = _dbQueue.Dequeue(); + ProcessCase(mRecord, conn); } + STPStartInfo stpStartInfo = new STPStartInfo(); + stpStartInfo.IdleTimeout = GlobalVariable.IdleTimeout * 1000; + stpStartInfo.MaxWorkerThreads = GlobalVariable.MaxThreadSize; + stpStartInfo.MinWorkerThreads = GlobalVariable.MinThreadSize; + _mainjobThreadPool = new SmartThreadPool(stpStartInfo); } - public void AcceptEvent(Object.CCSRecord _Record) + public void Shutdown() + { + _mainjobThreadPool.Shutdown(true, 1000); + _mainjobThreadPool.Dispose(); + _mainjobThreadPool = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + public void AcceptEvent(CcsRecord record) { int i = 0; - int ReConnectCount = 1; + int reConnectCount = 1; - - while ( i <= ReConnectCount ) + while (i <= reConnectCount) { try { - if (InsertEventRecord(_Record)) + if (InsertEventRecord(record, _mainConn)) { - if (DBConnList.Count > 0) + if (_dbQueue.Count > 0) { - //將EVETNQUERY的案件狀態改為開始處理 - Object.CCSRecord m_Record = getWaitRecord(); + CcsRecord mRecord = GetWaitRecord(_mainConn); - if (m_Record != null) + if (mRecord != null) { - System.Data.OracleClient.OracleConnection _Conn = (System.Data.OracleClient.OracleConnection)DBConnList[0]; - DBConnList.Remove(_Conn); - - ProcessCase(m_Record, _Conn); + OracleConnection conn = _dbQueue.Dequeue(); + ProcessCase(mRecord, conn); } } break; } } - catch (Exception ex) + catch (Exception) { - if (MainConn.State.ToString().Equals("Closed")) + if (_mainConn.State == ConnectionState.Closed) { i++; - if (i > ReConnectCount) - throw ex; + if (i > reConnectCount) + throw; } else - throw ex; + throw; } } - - } - private void ReadXML() + private void ReadXml() { XmlReader reader = null; try { + string file = Path.Combine(AppDataPath, DbConfigFilename); // 建立 XML 讀取器 XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; // 不處理註解 settings.IgnoreWhitespace = true; // 跳過空白 settings.ValidationType = ValidationType.None; // 不驗證任何資料 - reader = XmlTextReader.Create(System.AppDomain.CurrentDomain.BaseDirectory + "\\" + LoadFilename, settings); + reader = XmlReader.Create(file, settings); // 進入讀取主要部分 while (reader.Read()) @@ -164,273 +176,290 @@ switch (reader.NodeType) { case XmlNodeType.Element: - string LocalName = reader.LocalName; // 取得標籤名稱 + string localName = reader.LocalName; // 取得標籤名稱 // Step 3: 讀取 FileInfo 標籤的屬性 - if (LocalName.Equals("DBSetting")) + if (localName.Equals("DBSetting")) { - ConnectionString = String.Format("Data source={0};User Id={1};Password={2};", reader["DataSource"], reader["UserId"], reader["Password"]) ; - traceConnectionString = String.Format("{0}/{1}@{2}", reader["UserId"], reader["Password"], reader["DataSource"]); - ConnectionCount = Int32.Parse(reader["ConnectionCount"]); - LocalVariable.ShowError = bool.Parse(reader["ShowError"]); + GlobalVariable.ConnectionString = + $"Data source={reader["DataSource"]};User Id={reader["UserId"]};Password={reader["Password"]};"; + GlobalVariable.TraceConnectionString = + $"{reader["UserId"]}/{reader["Password"]}@{reader["DataSource"]}"; + string token = reader["ConnectionCount"]; + if (token != null) + { + GlobalVariable.MaxConnectionCount = int.Parse(token); + } + token = reader["ShowError"]; + if (token != null) + { + GlobalVariable.ShowError = bool.Parse(token); + } + } else if (localName.Equals("ThreadSetting")) + { + string token = reader["maxThreadSize"]; + if (token != null) + { + GlobalVariable.MaxThreadSize = int.Parse(token); + } + token = reader["minThreadSize"]; + if (token != null) + { + GlobalVariable.MinThreadSize = int.Parse(token); + } } break; } } reader.Close(); - } - catch (System.Xml.XmlException xe) + catch (XmlException xe) { Console.WriteLine(xe.StackTrace); - reader.Close(); + reader?.Close(); } } - private System.Data.OracleClient.OracleConnection CreateConnection() + private OracleConnection CreateConnection() { - System.Data.OracleClient.OracleConnection DBConn = new System.Data.OracleClient.OracleConnection(ConnectionString); - - DBConn.Open(); + OracleConnection dbConn = new OracleConnection(GlobalVariable.ConnectionString); - return DBConn; + dbConn.Open(); + + return dbConn; } [MethodImpl(MethodImplOptions.Synchronized)] - private bool InsertEventRecord(Object.CCSRecord _Record) + private bool InsertEventRecord(CcsRecord record, OracleConnection conn) { - Object.EventQuery _EventQuery = null; - System.Data.OracleClient.OracleTransaction _Transaction = null; + OracleTransaction transaction = null; try { - _MainLog = new SEventLog(); + _mainLog = new SEventLog(); - if (MainConn.State.ToString().Equals("Closed")) - MainConn.Open(); + if (conn.State.ToString().Equals("Closed")) + conn.Open(); - _Transaction = MainConn.BeginTransaction(); + transaction = conn.BeginTransaction(); - if (_Record.InsertDB(MainConn, _Transaction, _MainLog)) + if (record.InsertDb(conn, transaction, _mainLog)) { - _EventQuery = new CCSTrace.CCS.Object.EventQuery(); + var eventQuery = new EventQuery + { + CcsId = record.CcsId, + Meter = record.Meter, + CaseStatus = (int) CCSCaseState.EventInitial, + ChangeTime = record.AcceptTime + }; - _EventQuery.setCCSID(_Record.getCCSID()); - _EventQuery.setMeter(_Record.getMeter()); - _EventQuery.setCaseStatus(LocalVariable.EventInitial); - _EventQuery.setChangeTime(_Record.getAcceptTime()); - if (_EventQuery.Insert(_MainLog, MainConn, _Transaction)) - _Transaction.Commit(); + if (eventQuery.Insert(_mainLog, conn, transaction)) + transaction.Commit(); else { - if (_Transaction.Connection.State.ToString().Equals("Open")) - _Transaction.Rollback(); - + if (transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); + throw new Exception("案件未受理成功。"); } } else { - if (_Transaction.Connection.State.ToString().Equals("Open")) - _Transaction.Rollback(); - + if (transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); + throw new Exception("案件未受理成功。"); } - } - catch (System.Data.OracleClient.OracleException e) + catch (OracleException e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); - _MainLog.Error(e.Message); + _mainLog.Error(e.Message); - if (LocalVariable.ShowError) - _MainLog.Error(e.StackTrace); + if (GlobalVariable.ShowError) + _mainLog.Error(e.StackTrace); - if (_Transaction != null && _Transaction.Connection.State.ToString().Equals("Open") ) - _Transaction.Rollback(); + if (transaction != null && transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); - throw e; + throw; } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); - _MainLog.Error(ex.Message); + _mainLog.Error(ex.Message); - if (LocalVariable.ShowError) - _MainLog.Error(ex.StackTrace); + if (GlobalVariable.ShowError) + _mainLog.Error(ex.StackTrace); - if (_Transaction != null && _Transaction.Connection.State.ToString().Equals("Open") ) - _Transaction.Rollback(); + if (transaction != null && transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); - throw ex; + throw; } finally { - _MainLog.Close(); + _mainLog.Close(); } return true; } - delegate void WorkerThreadHandler(); + private delegate void WorkerThreadHandler(); - private void ProcessCase(Object.CCSRecord _Record, System.Data.OracleClient.OracleConnection _Conn) + private void ProcessCase(CcsRecord record, OracleConnection conn) { try { - if (_Conn.State.ToString().Equals("Closed")) - _Conn.Open(); + if (conn.State.ToString().Equals("Closed")) + conn.Open(); - ProcessEvent _ProcessEvent = new ProcessEvent(_Record, _Conn, traceConnectionString); - _ProcessEvent.ThreadFinish += new ThreadEndEventHandler(ThreadEndEventProcess); + ProcessEvent processEvent = new ProcessEvent(record, conn, GlobalVariable.TraceConnectionString); + processEvent.ThreadFinish += ThreadEndEventProcess; - System.Threading.ThreadStart _ThreadStart = new System.Threading.ThreadStart(_ProcessEvent.Run); - System.Threading.Thread _Thread = new System.Threading.Thread(_ThreadStart); - _Thread.Start(); + ThreadStart threadStart = processEvent.Run; + Thread thread = new Thread(threadStart); + thread.Start(); } catch { - DBConnList.Add(_Conn); + lock (_syncDbQueue) _dbQueue.Enqueue(conn); } } private void ThreadEndEventProcess(object sender, ThreadEndEvent e) { //將EVETNQUERY的案件狀態改為開始處理 - Object.CCSRecord m_Record = getWaitRecord(); + CcsRecord mRecord = GetWaitRecord(e.GetConnection()); try { - if (m_Record != null) - ProcessCase(m_Record, e.getConnection()); - else - DBConnList.Add(e.getConnection()); + if (mRecord != null) + ProcessCase(mRecord, e.GetConnection()); } - catch + finally { - DBConnList.Add(e.getConnection()); + lock (_syncDbQueue) _dbQueue.Enqueue(e.GetConnection()); } - } + } [MethodImpl(MethodImplOptions.Synchronized)] - private Object.CCSRecord getWaitRecord() + private CcsRecord GetWaitRecord(OracleConnection conn) { - String ProcessCCSID = ""; - String CCSID = ""; - Object.CCSRecord _Record = null; + string processCcsid = ""; + string ccsid = ""; + CcsRecord record = null; - foreach (String[] Obj in WaitingCases) + foreach (string[] obj in WaitingCases) { - String _CCSID = Obj[0]; - String _FDRID = Obj[1]; + string ccsId = obj[0]; + string fdrid = obj[1]; - if (ProcessFDR.ContainsKey(_FDRID)) //該條饋線仍有案件在處理中 - ProcessCCSID = ProcessCCSID + "'" + _CCSID + "',"; + if (ProcessFdr.ContainsKey(fdrid)) //該條饋線仍有案件在處理中 + processCcsid = processCcsid + "'" + ccsid + "',"; else { - CCSID = _CCSID; - WaitingCases.Remove(Obj); + ccsid = ccsId; + WaitingCases.Remove(obj); break; } } - if (CCSID.Length == 0) //沒有因同饋線而在等候中的案件 + if (ccsid.Length == 0) //沒有因同饋線而在等候中的案件 { - String SqlStmt = "SELECT Q.CCSID AS CCSID FROM CCS.EVENTQUERY Q,CCS.EVENTRECORD R WHERE Q.CASESTATUS IN (" + LocalVariable.EventInitial + "," + LocalVariable.EventProcess + ")"; - System.Collections.IEnumerator Enum = ProcessCases.GetEnumerator(); + string sqlStmt = "SELECT Q.CCSID AS CCSID FROM CCS.EVENTQUERY Q,CCS.EVENTRECORD R WHERE Q.CASESTATUS IN (" + (int) CCSCaseState.EventInitial + "," + (int) CCSCaseState.EventProcess + ")"; + IEnumerator Enum = ProcessCases.GetEnumerator(); while (Enum.MoveNext()) - ProcessCCSID = ProcessCCSID + "'" + Enum.Current.ToString() + "',"; + if (Enum.Current != null) processCcsid = processCcsid + "'" + Enum.Current + "',"; - if (ProcessCCSID.Length != 0) - SqlStmt = SqlStmt + " AND Q.CCSID NOT IN (" + ProcessCCSID.Substring(0, ProcessCCSID.Length - 1) + ")"; + if (processCcsid.Length != 0) + sqlStmt = sqlStmt + " AND Q.CCSID NOT IN (" + processCcsid.Substring(0, processCcsid.Length - 1) + ")"; - SqlStmt = SqlStmt + " AND Q.CCSID = R.CCSID AND ROWNUM < 2 ORDER BY Q.ChangeTime"; - System.Data.OracleClient.OracleCommand Command = new System.Data.OracleClient.OracleCommand(SqlStmt, MainConn); - System.Data.OracleClient.OracleDataReader reader = Command.ExecuteReader(); + sqlStmt = sqlStmt + " AND Q.CCSID = R.CCSID AND ROWNUM < 2 ORDER BY Q.ChangeTime"; + OracleCommand command = new OracleCommand(sqlStmt, conn); + OracleDataReader reader = command.ExecuteReader(); try { if (reader.Read()) - CCSID = reader["CCSID"].ToString(); + ccsid = reader["CCSID"].ToString(); } catch (Exception e) { Log(e.Message); - _MainLog.Error("無法取得等候處理CCS案件資料。錯誤訊息 = " + e.Message); + _mainLog.Error("無法取得等候處理CCS案件資料。錯誤訊息 = " + e.Message); - if (LocalVariable.ShowError) - _MainLog.Error(e.StackTrace); + if (GlobalVariable.ShowError) + _mainLog.Error(e.StackTrace); } finally { reader.Close(); - Command.Dispose(); + command.Dispose(); } } - if (CCSID.Length != 0) - _Record = new Object.CCSRecord(CCSID, MainConn, _MainLog); + if (ccsid.Length != 0) + record = new CcsRecord(ccsid, conn, _mainLog); - if (_Record != null) + if (record != null) { - CCS.Object.EventQuery EventQuery = new CCSTrace.CCS.Object.EventQuery(); + EventQuery eventQuery = new EventQuery(); //先將EVETNQUERY的案件狀態改為開始處理 - EventQuery.setCCSID(_Record.getCCSID()); - EventQuery.setCaseStatus(LocalVariable.EventProcess); + eventQuery.CcsId = record.CcsId; + eventQuery.CaseStatus = (int) CCSCaseState.EventProcess; - System.Data.OracleClient.OracleTransaction _Transaction = MainConn.BeginTransaction(); + OracleTransaction transaction = conn.BeginTransaction(); try { - - if (EventQuery.UpdateCaseStatus(_MainLog, MainConn, _Transaction)) + if (eventQuery.UpdateCaseStatus(_mainLog, conn, transaction)) { - _MainLog.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + _Record.getCCSID() + ")"); - _Transaction.Commit(); - ProcessCases.Add(_Record.getCCSID()); + _mainLog.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + record.CcsId + ")"); + transaction.Commit(); + ProcessCases.Add(record.CcsId); } else { - _MainLog.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + _Record.getCCSID() + ")"); + _mainLog.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + record.CcsId + ")"); - if (_Transaction.Connection.State.ToString().Equals("Open")) - _Transaction.Rollback(); + if (transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); } } catch (Exception e) { - if (_Transaction.Connection.State.ToString().Equals("Open")) - _Transaction.Rollback(); + if (transaction.Connection.State.ToString().Equals("Open")) + transaction.Rollback(); Log(e.Message); - _Record = null; + record = null; } } - return _Record; + return record; } - private void Log(String message) + private void Log(string message) { - RecordLog _PLog = null; + RecordLog pLog = null; try { - _PLog = new RecordLog(CCS.LocalVariable.CCS_ListPath + "MAIN.txt"); - _PLog.Error(message); + pLog = new RecordLog(GlobalVariable.CcsListPath + "MAIN.txt"); + pLog.Error(message); } finally { - if (_PLog != null) + if (pLog != null) { - _PLog.Close(); + pLog.Close(); } } } - } -} +} \ No newline at end of file -- Gitblit v0.0.0-SNAPSHOT