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