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