From 410dc2d04dbecf019129cd8cd65a3be2c62b4d0c Mon Sep 17 00:00:00 2001 From: ulysseskao <ulysseskao@gmail.com> Date: Tue, 03 May 2016 18:36:41 +0800 Subject: [PATCH] refator code --- CCSTrace/CCS/CCSMain.cs | 161 +++++++++++++++++++++++++++++------------------------ 1 files changed, 87 insertions(+), 74 deletions(-) diff --git a/CCSTrace/CCS/CCSMain.cs b/CCSTrace/CCS/CCSMain.cs index cfff0ca..49b05a5 100644 --- a/CCSTrace/CCS/CCSMain.cs +++ b/CCSTrace/CCS/CCSMain.cs @@ -4,6 +4,7 @@ using System.Data; using System.Data.OracleClient; using System.IO; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Web; @@ -11,6 +12,7 @@ using Amib.Threading; using CCSTrace.CCS.Domain; using CCSTrace.CCS.Object; +using Iesi.Collections.Generic; using NLog; namespace CCSTrace.CCS @@ -22,17 +24,15 @@ private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static CcsMain _instance; - 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 - - private int _connectionCount = 1; + private readonly int _connectionCount = 1; private OracleConnection _mainConn = null; private SmartThreadPool _mainjobThreadPool = null; private readonly object _syncDbQueue = new object(); private readonly Queue<OracleConnection> _dbQueue = new Queue<OracleConnection>(); + private readonly List<string> _processingCases = new List<string>(); + private readonly List<KeyValuePair<string, int>> _waitingCases = new List<KeyValuePair<string, int>>();//Record the case when the case's FDR processed by another + public CcsMain() { @@ -42,18 +42,13 @@ public string AppDataPath { get; set; } - public static CcsMain Instance() - { - // Uses lazy initialization. + public SortedSet<int> ProcessingFdr { get; } = new SortedSet<int>(); - // Note: this is not thread safe. + public static CcsMain Instance => _instance ?? (_instance = new CcsMain()); - if (_instance == null) - { - _instance = new CcsMain(); - } - return _instance; - } + public List<string> ProcessingCases => _processingCases; + + public List<KeyValuePair<string, int>> WaitingCases => _waitingCases; public void Startup() { @@ -66,13 +61,12 @@ if (_mainConn == null) _mainConn = CreateConnection(); - //MainConn = CreateMainConnection(); Logger.Info("CCSMain has been connected database."); GlobalVariable.CcsCodelist = new CcsCodelist(_mainConn); GlobalVariable.EosCodelist = new EosCodelist(_mainConn); - for (int i = 0; i < _connectionCount; i++) + for (var i = 0; i < _connectionCount; i++) { lock (_syncDbQueue) _dbQueue.Enqueue(CreateConnection()); } @@ -82,23 +76,25 @@ Logger.Error(e, e.Message); throw; } - finally - { - } - CcsRecord mRecord = GetWaitRecord(_mainConn); + var addrContrast = AddrContrast.Instance; + addrContrast.initialize(_mainConn); - if (mRecord != null) + CCSEventRecord ccsEventRecord = GetWaitRecord(_mainConn); + + if (ccsEventRecord != null) { - OracleConnection conn = null; + OracleConnection conn; lock (_syncDbQueue) conn = _dbQueue.Dequeue(); - ProcessCase(mRecord, conn); + ProcessCase(ccsEventRecord, conn); } - STPStartInfo stpStartInfo = new STPStartInfo(); - stpStartInfo.IdleTimeout = GlobalVariable.IdleTimeout * 1000; - stpStartInfo.MaxWorkerThreads = GlobalVariable.MaxThreadSize; - stpStartInfo.MinWorkerThreads = GlobalVariable.MinThreadSize; + STPStartInfo stpStartInfo = new STPStartInfo + { + IdleTimeout = GlobalVariable.IdleTimeout*1000, + MaxWorkerThreads = GlobalVariable.MaxThreadSize, + MinWorkerThreads = GlobalVariable.MinThreadSize + }; _mainjobThreadPool = new SmartThreadPool(stpStartInfo); Logger.Info("Create Thread Pool."); } @@ -112,11 +108,18 @@ GC.WaitForPendingFinalizers(); } - public void AcceptEvent(CcsRecord record) + public void AcceptEvent(CCSEventRecord ccsEventRecord) { /* WorkItemCallback workItemCallback = new WorkItemCallback(this.DoWork); - _mainjobThreadPool.QueueWorkItem(workItemCallback, record); + _mainjobThreadPool.QueueWorkItem(workItemCallback, ccsEventRecord); + WIGStartInfo wigStartInfo = new WIGStartInfo() + { + FillStateWithArgs = true, + }; + _wig1 = _smartThreadPool.CreateWorkItemsGroup((int)spinCon1.Value, wigStartInfo); + _wig2 = _smartThreadPool.CreateWorkItemsGroup((int)spinCon2.Value, wigStartInfo); + */ int i = 0; @@ -126,18 +129,18 @@ { try { - if (InsertEventRecord(record, _mainConn)) + if (InsertCCSEventRecord(ccsEventRecord, _mainConn)) { if (_dbQueue.Count > 0) { //將EVETNQUERY的案件狀態改為開始處理 - CcsRecord mRecord = GetWaitRecord(_mainConn); + CCSEventRecord waitCcsEventRecord = GetWaitRecord(_mainConn); - if (mRecord != null) + if (waitCcsEventRecord != null) { OracleConnection conn = null; lock (_syncDbQueue) conn = _dbQueue.Dequeue(); - ProcessCase(mRecord, conn); + ProcessCase(waitCcsEventRecord, conn); } } @@ -226,7 +229,15 @@ private OracleConnection CreateConnection() { - OracleConnection dbConn = new OracleConnection(GlobalVariable.ConnectionString); + OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(GlobalVariable.ConnectionString) + { + MaxPoolSize = 20, + MinPoolSize = 5, + Pooling = true + }; + string connectstring = builder.ToString(); + + OracleConnection dbConn = new OracleConnection(connectstring); dbConn.Open(); @@ -234,7 +245,7 @@ } [MethodImpl(MethodImplOptions.Synchronized)] - private bool InsertEventRecord(CcsRecord record, OracleConnection conn) + private bool InsertCCSEventRecord(CCSEventRecord ccsEventRecord, OracleConnection conn) { OracleTransaction transaction = null; @@ -245,18 +256,18 @@ transaction = conn.BeginTransaction(); - if (record.InsertDb(conn, transaction)) + if (ccsEventRecord.InsertDb(conn, transaction)) { - var eventQuery = new EventQuery + var ccsEventQuery = new CCSEventQuery { - CcsId = record.CcsId, - Meter = record.Meter, + CcsId = ccsEventRecord.CcsId, + Meter = ccsEventRecord.Meter, CaseStatus = (int) CCSCaseState.EventInitial, - ChangeTime = record.AcceptTime + ChangeTime = ccsEventRecord.AcceptTime }; - if (eventQuery.Insert(conn, transaction)) + if (ccsEventQuery.Insert(conn, transaction)) transaction.Commit(); else { @@ -298,14 +309,14 @@ private delegate void WorkerThreadHandler(); - private void ProcessCase(CcsRecord record, OracleConnection conn) + private void ProcessCase(CCSEventRecord ccsEventRecord, OracleConnection conn) { try { - if (conn.State.ToString().Equals("Closed")) + if (conn.State == ConnectionState.Closed) conn.Open(); - ProcessEvent processEvent = new ProcessEvent(record, conn, GlobalVariable.TraceConnectionString); + ProcessEvent processEvent = new ProcessEvent(ccsEventRecord, conn, GlobalVariable.TraceConnectionString); processEvent.ThreadFinish += ThreadEndEventProcess; ThreadStart threadStart = processEvent.Run; @@ -321,12 +332,12 @@ private void ThreadEndEventProcess(object sender, ThreadEndEvent e) { //將EVETNQUERY的案件狀態改為開始處理 - CcsRecord mRecord = GetWaitRecord(e.GetConnection()); + CCSEventRecord waitCcsEventRecord = GetWaitRecord(e.GetConnection()); try { - if (mRecord != null) - ProcessCase(mRecord, e.GetConnection()); + if (waitCcsEventRecord != null) + ProcessCase(waitCcsEventRecord, e.GetConnection()); } finally { @@ -335,39 +346,39 @@ } [MethodImpl(MethodImplOptions.Synchronized)] - private CcsRecord GetWaitRecord(OracleConnection conn) + private CCSEventRecord GetWaitRecord(OracleConnection conn) { string processCcsid = ""; string ccsid = ""; - CcsRecord record = null; + CCSEventRecord ccsEventRecord = null; - foreach (string[] obj in WaitingCases) + foreach (var obj in _waitingCases) { - string ccsId = obj[0]; - string fdrid = obj[1]; + var ccsId = obj.Key; + var fdrid = obj.Value; - if (ProcessFdr.ContainsKey(fdrid)) //該條饋線仍有案件在處理中 + if (ProcessingFdr.Contains(fdrid)) //該條饋線仍有案件在處理中 processCcsid = processCcsid + "'" + ccsid + "',"; else { ccsid = ccsId; - WaitingCases.Remove(obj); + _waitingCases.Remove(obj); break; } } if (ccsid.Length == 0) //沒有因同饋線而在等候中的案件 { - 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(); + var sqlStmt = "SELECT Q.CCSID AS CCSID FROM CCS.EVENTQUERY Q,CCS.EVENTRECORD R WHERE Q.CASESTATUS IN (" + + (int) CCSCaseState.EventInitial + "," + + (int) CCSCaseState.EventProcess + ")"; - while (Enum.MoveNext()) - if (Enum.Current != null) processCcsid = processCcsid + "'" + Enum.Current + "',"; + processCcsid = _processingCases.Aggregate(processCcsid, (current, item) => current + "'" + item + "',"); 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"; + sqlStmt = sqlStmt + " AND Q.CCSID = R.CCSID AND ROWNUM < 2 ORDER BY Q.CHANGETIME"; OracleCommand command = new OracleCommand(sqlStmt, conn); OracleDataReader reader = command.ExecuteReader(); @@ -388,44 +399,46 @@ } if (ccsid.Length != 0) - record = new CcsRecord(ccsid, conn); + ccsEventRecord = new CCSEventRecord(ccsid, conn); - if (record != null) + if (ccsEventRecord != null) { - EventQuery eventQuery = new EventQuery(); + CCSEventQuery ccsEventQuery = new CCSEventQuery + { + CcsId = ccsEventRecord.CcsId, + CaseStatus = (int) CCSCaseState.EventProcess + }; //先將EVETNQUERY的案件狀態改為開始處理 - eventQuery.CcsId = record.CcsId; - eventQuery.CaseStatus = (int) CCSCaseState.EventProcess; OracleTransaction transaction = conn.BeginTransaction(); try { - if (eventQuery.UpdateCaseStatus(conn, transaction)) + if (ccsEventQuery.UpdateCaseStatus(conn, transaction)) { - Logger.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + record.CcsId + ")"); + Logger.Info("更新EVENTQUERY的案件狀態為處理中.(CCSID = " + ccsEventRecord.CcsId + ")"); transaction.Commit(); - ProcessCases.Add(record.CcsId); + _processingCases.Add(ccsEventRecord.CcsId); } else { - Logger.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + record.CcsId + ")"); + Logger.Error("無法更新EVENTQUERY的案件狀態.(CCSID = " + ccsEventRecord.CcsId + ")"); - if (transaction.Connection.State.ToString().Equals("Open")) + if (transaction.Connection.State == ConnectionState.Open) transaction.Rollback(); } } catch (Exception e) { - if (transaction.Connection.State.ToString().Equals("Open")) + if (transaction.Connection.State == ConnectionState.Open) transaction.Rollback(); Logger.Error(e, e.Message); - record = null; + ccsEventRecord = null; } } - return record; + return ccsEventRecord; } } } \ No newline at end of file -- Gitblit v0.0.0-SNAPSHOT