From 925ab619ead90124abdab6202d91980d992b1e11 Mon Sep 17 00:00:00 2001
From: ulysseskao <ulysseskao@gmail.com>
Date: Tue, 03 May 2016 19:33:17 +0800
Subject: [PATCH] add thread setting

---
 CCSTrace/CCS/ProcessEvent.cs     |    3 
 CCSTrace/CCS/CCSMain.cs          |   45 +++++++++++---
 CCSTrace/App_Data/DBConfig.xml   |    1 
 CCSTrace/CCS/Object/AlarmData.cs |   98 +++++++++++++++++---------------
 CCSTrace/CCSTrace.csproj         |    2 
 CCSTrace/DBConfig.xml            |    1 
 6 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/CCSTrace/App_Data/DBConfig.xml b/CCSTrace/App_Data/DBConfig.xml
index c9641d1..109e76a 100644
--- a/CCSTrace/App_Data/DBConfig.xml
+++ b/CCSTrace/App_Data/DBConfig.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="big5" ?>
   <CCS>
     <DBSetting DataSource = "nntpc" UserId = "basedb" Password = "BASEDB000" ConnectionCount = "3" ShowError = "false" />
+    <ThreadSetting maxThreadSize="2" minThreadSize="1" />
   </CCS>
\ No newline at end of file
diff --git a/CCSTrace/CCS/CCSMain.cs b/CCSTrace/CCS/CCSMain.cs
index 49b05a5..a9a480b 100644
--- a/CCSTrace/CCS/CCSMain.cs
+++ b/CCSTrace/CCS/CCSMain.cs
@@ -77,8 +77,8 @@
                 throw;
             }
 
-            var addrContrast = AddrContrast.Instance;
-            addrContrast.initialize(_mainConn);
+            AddrContrast.Instance.Initialize(_mainConn);
+            AlarmData.Instance.Initialize(_mainConn);
 
             CCSEventRecord ccsEventRecord = GetWaitRecord(_mainConn);
 
@@ -108,11 +108,32 @@
             GC.WaitForPendingFinalizers();
         }
 
+        public void AcceptEvent2(CCSEventRecord ccsEventRecord)
+        {
+            // WorkItemCallback workItemCallback = new WorkItemCallback(this.DoEventWork);
+            _mainjobThreadPool.QueueWorkItem(DoEventWork, ccsEventRecord);
+        }
+
+        private void DoEventWork(CCSEventRecord state)
+        {
+            OracleConnection conn;
+            lock (_syncDbQueue) conn = _dbQueue.Dequeue();
+
+            try
+            {
+                AcceptEvent(state);
+            }
+            finally
+            {
+                lock (_syncDbQueue) _dbQueue.Enqueue(conn);
+            }
+
+
+        }
+
         public void AcceptEvent(CCSEventRecord ccsEventRecord)
         {
             /*
-            WorkItemCallback workItemCallback = new WorkItemCallback(this.DoWork);
-            _mainjobThreadPool.QueueWorkItem(workItemCallback, ccsEventRecord);
             WIGStartInfo wigStartInfo = new WIGStartInfo()
             {
                 FillStateWithArgs = true,
@@ -138,7 +159,7 @@
 
                             if (waitCcsEventRecord != null)
                             {
-                                OracleConnection conn = null;
+                                OracleConnection conn;
                                 lock (_syncDbQueue) conn = _dbQueue.Dequeue();
                                 ProcessCase(waitCcsEventRecord, conn);
                             }
@@ -170,10 +191,12 @@
             {
                 string file = Path.Combine(AppDataPath, DbConfigFilename);
                 // 建立 XML 讀取器
-                XmlReaderSettings settings = new XmlReaderSettings();
-                settings.IgnoreComments = true; // 不處理註解
-                settings.IgnoreWhitespace = true; // 跳過空白
-                settings.ValidationType = ValidationType.None; // 不驗證任何資料
+                XmlReaderSettings settings = new XmlReaderSettings
+                {
+                    IgnoreComments = true, // 不處理註解
+                    IgnoreWhitespace = true, // 跳過空白
+                    ValidationType = ValidationType.None // 不驗證任何資料
+                };
                 reader = XmlReader.Create(file, settings);
 
                 // 進入讀取主要部分
@@ -231,8 +254,8 @@
         {
             OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(GlobalVariable.ConnectionString)
             {
-                MaxPoolSize = 20,
-                MinPoolSize = 5,
+                MaxPoolSize = GlobalVariable.MaxConnectionCount,
+                MinPoolSize = 1,
                 Pooling = true
             };
             string connectstring = builder.ToString();
diff --git a/CCSTrace/CCS/Object/AlarmData.cs b/CCSTrace/CCS/Object/AlarmData.cs
index 6ea8f2c..e8cd1e9 100644
--- a/CCSTrace/CCS/Object/AlarmData.cs
+++ b/CCSTrace/CCS/Object/AlarmData.cs
@@ -1,9 +1,10 @@
 using System;
-
 using System.Collections;
+using System.Collections.Generic;
 using System.Data.OracleClient;
 using System.Net;
 using System.Net.Sockets;
+using CCSTrace.TPower.DMMS.Model.CCS;
 using NLog;
 
 namespace CCSTrace.CCS.Object
@@ -11,30 +12,34 @@
     public class AlarmData
     {
         private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
-        private Hashtable _mTotalData = new Hashtable();
-        private OracleConnection _connectionTpc;
-        private OracleTransaction _transaction;
 
-        public AlarmData(OracleConnection conn, OracleTransaction trx)
+        public static AlarmData Instance { get; } = new AlarmData();
+
+        private readonly Dictionary<int, ALARMIP> _totalAddrData = new Dictionary<int, ALARMIP>();
+
+        private AlarmData()
         {
-            _connectionTpc = conn;
-            _transaction = trx;
+        }
 
+        public void Initialize(OracleConnection conn)
+        {
             var sqlStmt = "SELECT DEPTID,IP1,IP2,IP_PATROL FROM CCS.ALARM_IP";
-            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
+            OracleCommand command = new OracleCommand(sqlStmt, conn);
             OracleDataReader reader = command.ExecuteReader();
 
             try
             {
                 while (reader.Read())
                 {
-                    ArrayList tmp = new ArrayList();
-                    tmp.Add(Convert.ToInt32(reader["DEPTID"].ToString()));
-                    tmp.Add(reader["IP1"].ToString());
-                    tmp.Add(reader["IP2"].ToString());
-                    tmp.Add(reader["IP_Patrol"].ToString());
+                    ALARMIP tmp = new ALARMIP
+                    {
+                        DEPTID = Convert.ToInt32(reader["DEPTID"].ToString()),
+                        IP1 = reader["IP1"].ToString(),
+                        IP2 = reader["IP2"].ToString(),
+                        IPPATROL = reader["IP_Patrol"].ToString()
+                    };
 
-                    _mTotalData.Add(Convert.ToInt32(reader["DeptID"].ToString()), tmp);
+                    _totalAddrData.Add(tmp.DEPTID, tmp);
                 }
             }
             catch (Exception e)
@@ -84,27 +89,27 @@
             return ssccode;
         }
 
-        private ArrayList GetIpAddress(int deptCode)
+        private ALARMIP GetIpAddress(int deptCode)
         {
-            return (ArrayList)_mTotalData[Convert.ToInt32(deptCode)];
+            return _totalAddrData[deptCode];
         }
 
-        public bool Alarm(string acceptNum, int dept)
+        public bool Alarm(OracleConnection conn, OracleTransaction trx, string acceptNum, int dept)
         {
             Logger.Info("開始Alarm...");
-            Socket mClient;
-            ArrayList ipAddressSet = GetIpAddress(GetSscCode(dept, Convert.ToInt32(DateTime.Now.DayOfWeek)));
+            Socket clientSocket;
+            ALARMIP alarmip = GetIpAddress(GetSscCode(dept, Convert.ToInt32(DateTime.Now.DayOfWeek)));
             string ip1;
             string ip2;
             string ipPatrol;
             System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
 
-            if (ipAddressSet != null)
+            if (alarmip != null)
             {
                 Logger.Info("已取得該部門所需通知的IP Address.");
-                ip1 = ipAddressSet[1].ToString();
-                ip2 = ipAddressSet[2].ToString();
-                ipPatrol = ipAddressSet[3].ToString();
+                ip1 = alarmip.IP1;
+                ip2 = alarmip.IP2;
+                ipPatrol = alarmip.IPPATROL;
             }
             else
             {
@@ -115,18 +120,18 @@
             try
             {
                 IPAddress serverIp = IPAddress.Parse(ip1);
-                int serverPort = Convert.ToInt32(GlobalVariable.AlermPort);
+                var serverPort = Convert.ToInt32(GlobalVariable.AlermPort);
                 IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
 
-                mClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                mClient.Connect(iep);
+                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                clientSocket.Connect(iep);
 
                 byte[] byteMessage = encoding.GetBytes(acceptNum);
 
-                mClient.Send(byteMessage);
-                mClient.Shutdown(SocketShutdown.Both);
-                mClient.Close();
-                RecordAlarmIp(acceptNum, ip1);
+                clientSocket.Send(byteMessage);
+                clientSocket.Shutdown(SocketShutdown.Both);
+                clientSocket.Close();
+                RecordAlarmIp(conn, trx, acceptNum, ip1);
                 Logger.Info("已成功通知" + ip1 + " !");
                 return true;
             }
@@ -138,18 +143,18 @@
             try
             {
                 IPAddress serverIp = IPAddress.Parse(ip2);
-                int serverPort = Convert.ToInt32(GlobalVariable.AlermPort);
+                var serverPort = Convert.ToInt32(GlobalVariable.AlermPort);
                 IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
 
-                mClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                mClient.Connect(iep);
+                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                clientSocket.Connect(iep);
 
                 byte[] byteMessage = encoding.GetBytes(acceptNum);
 
-                mClient.Send(byteMessage);
-                mClient.Shutdown(SocketShutdown.Both);
-                mClient.Close();
-                RecordAlarmIp(acceptNum, ip2);
+                clientSocket.Send(byteMessage);
+                clientSocket.Shutdown(SocketShutdown.Both);
+                clientSocket.Close();
+                RecordAlarmIp(conn, trx, acceptNum, ip2);
                 Logger.Info("已成功通知" + ip2 + " !");
                 return true;
             }
@@ -164,15 +169,15 @@
                 int serverPort = Convert.ToInt32(GlobalVariable.AlermPort);
                 IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
 
-                mClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                mClient.Connect(iep);
+                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                clientSocket.Connect(iep);
 
                 byte[] byteMessage = encoding.GetBytes(acceptNum);
 
-                mClient.Send(byteMessage);
-                mClient.Shutdown(SocketShutdown.Both);
-                mClient.Close();
-                RecordAlarmIp(acceptNum, ipPatrol);
+                clientSocket.Send(byteMessage);
+                clientSocket.Shutdown(SocketShutdown.Both);
+                clientSocket.Close();
+                RecordAlarmIp(conn, trx, acceptNum, ipPatrol);
                 Logger.Info("已成功通知" + ipPatrol + " !");
                 return true;
             }
@@ -184,11 +189,11 @@
             }
         }
 
-        private void RecordAlarmIp(string accNum, string ip)
+        private void RecordAlarmIp(OracleConnection conn, OracleTransaction trx, string accNum, string ip)
         {
-            string sqlStmt = "insert into eos.case_dispatch (acceptnum,alarmip) values('" + accNum + "','" + ip + "')";
+            string sqlStmt = "INSERT INTO EOS.CASE_DISPATCH (ACCEPTNUM,ALARMIP) VALUES('" + accNum + "','" + ip + "')";
 
-            OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc, _transaction);
+            OracleCommand command = new OracleCommand(sqlStmt, conn, trx);
 
             try
             {
@@ -198,7 +203,6 @@
             catch (Exception e)
             {
                 Logger.Error("recordAlarmIP Error." + e.Message);
-                return;
             }
             finally
             {
diff --git a/CCSTrace/CCS/ProcessEvent.cs b/CCSTrace/CCS/ProcessEvent.cs
index e4bbbde..6e08771 100644
--- a/CCSTrace/CCS/ProcessEvent.cs
+++ b/CCSTrace/CCS/ProcessEvent.cs
@@ -290,8 +290,7 @@
                     // 須等全部動作都正確做完才可作commit的動作
                     _trx.Commit();
                     _trx.Dispose();
-                    var alarmClient = new AlarmData(_connectionTpc, _trx);
-                    alarmClient.Alarm(_eosEventRecord.AcceptNum, _eosEventRecord.Dept);
+                    AlarmData.Instance.Alarm(_connectionTpc, _trx, _eosEventRecord.AcceptNum, _eosEventRecord.Dept);
                 }
                 else
                 {
diff --git a/CCSTrace/CCSTrace.csproj b/CCSTrace/CCSTrace.csproj
index 2a67135..34d5f6e 100644
--- a/CCSTrace/CCSTrace.csproj
+++ b/CCSTrace/CCSTrace.csproj
@@ -174,7 +174,7 @@
     <Compile Include="CCS\Function\Leach.cs" />
     <Compile Include="CCS\Function\MergeCase.cs" />
     <Compile Include="CCS\NHibertnateSession.cs" />
-    <Compile Include="CCS\Object\Addr_Contrast.cs" />
+    <Compile Include="CCS\Object\AddrContrast.cs" />
     <Compile Include="CCS\Object\AlarmData.cs" />
     <Compile Include="CCS\Object\CCSCodelist.cs" />
     <Compile Include="CCS\Object\CCSEventRecord.cs" />
diff --git a/CCSTrace/DBConfig.xml b/CCSTrace/DBConfig.xml
index f7cacb7..ad9b2f1 100644
--- a/CCSTrace/DBConfig.xml
+++ b/CCSTrace/DBConfig.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="big5" ?>
   <CCS>
     <DBSetting DataSource = "nntpc" UserId = "basedb" Password = "BASEDB000" ConnectionCount = "3" ShowError = "false" />
+    <ThreadSetting maxThreadSize="2" minThreadSize="1" />
   </CCS>
\ No newline at end of file

--
Gitblit v0.0.0-SNAPSHOT