瀏覽代碼

Move log upload thread to LogUploader class

Brett Credo 8 年之前
父節點
當前提交
f7c5c504f0

+ 1 - 0
BulkPrinting/BulkPrinting/BulkPrinting.csproj

@@ -163,6 +163,7 @@
163 163
       <DependentUpon>ExportForm.cs</DependentUpon>
164 164
     </Compile>
165 165
     <Compile Include="Globals.cs" />
166
+    <Compile Include="LogUploader.cs" />
166 167
     <Compile Include="Migrations.cs" />
167 168
     <Compile Include="ObservedForm.cs">
168 169
       <SubType>Form</SubType>

+ 1 - 4
BulkPrinting/BulkPrinting/Globals.cs

@@ -20,10 +20,7 @@ namespace BulkPrinting
20 20
         public static Printer MaxPrinter;
21 21
         public static List<int> OpenBatches;
22 22
         public static UserLimits UserCurrentUsage;
23
-        public static Thread LogUploadThread;
24
-        public static object LogUploadThreadLock = new object();
25
-        public static bool LogUploadThreadCancelled;
26
-        public static bool UploadNewLogs;
23
+        public static LogUploader LogUploader;
27 24
         public static Thread LogDownloadThread;
28 25
         public static object LogDownloadThreadLock = new object();
29 26
         public static bool LogDownloadThreadCancelled;

+ 140 - 0
BulkPrinting/BulkPrinting/LogUploader.cs

@@ -0,0 +1,140 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Data.SQLite;
4
+using System.Threading;
5
+
6
+namespace BulkPrinting
7
+{
8
+    public class LogUploader
9
+    {
10
+        private const int _uploadPageSize = 5000;
11
+        private const int _retryInterval = 30000;
12
+
13
+        private Thread _thread;
14
+        private object _lock = new object();
15
+        private DBHelper _db;
16
+        private bool _cancelled;
17
+        private bool _uploadTriggered;
18
+
19
+        public LogUploader(DBHelper db)
20
+        {
21
+            _db = db;
22
+            _thread = new Thread(Run);
23
+        }
24
+
25
+        public void Cancel()
26
+        {
27
+            lock (_lock)
28
+            {
29
+                _cancelled = true;
30
+                Monitor.Pulse(_lock);
31
+            }
32
+        }
33
+
34
+        public void Join()
35
+        {
36
+            _thread.Join();
37
+        }
38
+
39
+        private void Run()
40
+        {
41
+            var isCancelled = false;
42
+            while (!isCancelled)
43
+            {
44
+                var uploadFailed = false;
45
+                int lastSyncedLogId = Utility.GetLastSyncedLogID();
46
+
47
+                var result = _db.ExecuteScalar("SELECT MAX(Id) FROM Logs")?.ToString() ?? "0";
48
+                if (string.IsNullOrWhiteSpace(result))
49
+                {
50
+                    result = "0";
51
+                }
52
+                int lastRecordedLogId = int.Parse(result.ToString());
53
+
54
+                if (lastRecordedLogId > lastSyncedLogId)
55
+                {
56
+                    List<RemoteVendorEvent> eventList = new List<RemoteVendorEvent>();
57
+                    int counter = 0;
58
+                    using (var Command = _db.CreateCommand(
59
+                        "Select Id,UserId,VoucherId,EventDate,EventType From Logs WHERE Id > @id",
60
+                        new SQLiteParameter("@id", lastSyncedLogId)))
61
+                    {
62
+                        using (SQLiteDataReader read = Command.ExecuteReader())
63
+                        {
64
+                            while (read.Read())
65
+                            {
66
+                                counter += 1;
67
+                                var nextEvent = new RemoteVendorEvent();
68
+                                nextEvent.Id = read.GetInt32(0);
69
+                                nextEvent.UserId = read.GetInt32(1);
70
+                                if (read.IsDBNull(2) == true)
71
+                                {
72
+                                    nextEvent.VoucherId = null;
73
+                                }
74
+                                else
75
+                                {
76
+                                    nextEvent.VoucherId = read.GetInt32(2);
77
+                                }
78
+                                nextEvent.EventDate = read.GetDateTime(3);
79
+                                nextEvent.EventType = (VendorEvent.VendorEventType)Enum.Parse(typeof(VendorEvent.VendorEventType), read.GetValue(4).ToString());
80
+                                nextEvent.VendorId = Globals.SessionData.Credentials.Payload.Vendor.id;
81
+                                eventList.Add(nextEvent);
82
+
83
+                                if (counter == _uploadPageSize)
84
+                                {
85
+                                    var response = new RemoteVendorEventResponse();
86
+                                    if (Utility.RESTRequest(eventList, ref response, "/api/vendorevents/"))
87
+                                    {
88
+                                        counter = 0;
89
+                                        eventList.Clear();
90
+                                    }
91
+                                    else
92
+                                    {
93
+                                        uploadFailed = true;
94
+                                        break;
95
+                                    }
96
+                                }
97
+                            }
98
+                            if ((counter > 0) && ! uploadFailed)
99
+                            {
100
+                                var response = new RemoteVendorEventResponse();
101
+                                if (!Utility.RESTRequest(eventList, ref response, "/api/vendorevents/"))
102
+                                {
103
+                                    uploadFailed = true;
104
+                                }
105
+                            }
106
+                        }
107
+                    }
108
+                }
109
+
110
+                lock (_lock)
111
+                {
112
+                    while (!_cancelled && !_uploadTriggered)
113
+                    {
114
+                        Monitor.Wait(_lock, uploadFailed ? _retryInterval : Timeout.Infinite);
115
+                        if (uploadFailed)
116
+                        {
117
+                            break;
118
+                        }
119
+                    }
120
+                    _uploadTriggered = false;
121
+                    isCancelled = _cancelled;
122
+                }
123
+            }
124
+        }
125
+
126
+        public void Start()
127
+        {
128
+            _thread.Start();
129
+        }
130
+
131
+        public void TriggerUpload()
132
+        {
133
+            lock (_lock)
134
+            {
135
+                _uploadTriggered = true;
136
+                Monitor.Pulse(_lock);
137
+            }
138
+        }
139
+    }
140
+}

+ 11 - 116
BulkPrinting/BulkPrinting/Utility.cs

@@ -533,22 +533,23 @@ namespace BulkPrinting
533 533
                     new SQLiteParameter("@value", SessionDataJson));
534 534
                 LogEvent(Globals.DB, VendorEvent.VendorEventType.Logout);
535 535
 
536
-                CancelLogUploadWorker();
536
+                if (Globals.LogUploader != null)
537
+                    Globals.LogUploader.Cancel();
538
+
537 539
                 CancelLogDownloadWorker();
538 540
 
539
-                if (Globals.LogUploadThread != null)
541
+                if (Globals.LogUploader != null)
540 542
                 {
541
-                    Globals.LogUploadThread.Join();
542
-                    Globals.LogUploadThread = null;
543
+                    Globals.LogUploader.Join();
544
+                    Globals.LogUploader = null;
543 545
                 }
546
+
544 547
                 if (Globals.LogDownloadThread != null)
545 548
                 {
546 549
                     Globals.LogDownloadThread.Join();
547 550
                     Globals.LogDownloadThread = null;
548 551
                 }
549 552
 
550
-                Globals.UploadNewLogs = false;
551
-                Globals.LogUploadThreadCancelled = false;
552 553
                 Globals.LogDownloadThreadCancelled = false;
553 554
 
554 555
                 Globals.DB.Close();
@@ -709,122 +710,16 @@ namespace BulkPrinting
709 710
             }
710 711
         }
711 712
 
712
-        public static void CancelLogUploadWorker()
713
-        {
714
-            lock (Globals.LogUploadThreadLock)
715
-            {
716
-                Globals.LogUploadThreadCancelled = true;
717
-                Monitor.Pulse(Globals.LogUploadThreadLock);
718
-            }
719
-        }
720
-
721
-        public static void LogUploadWorker()
722
-        {
723
-            const int uploadPageSize = 1000;
724
-            var retryInterval = 30000;
725
-
726
-            var db = Globals.DB;
727
-            //using (var db = OpenDBConnection())
728
-            {
729
-                var cancelled = false;
730
-                while (! cancelled)
731
-                {
732
-                    var uploadFailed = false;
733
-                    int lastSyncedLogId = GetLastSyncedLogID();
734
-
735
-                    var result = db.ExecuteScalar("SELECT MAX(Id) FROM Logs")?.ToString() ?? "0";
736
-                    if (string.IsNullOrWhiteSpace(result))
737
-                    {
738
-                        result = "0";
739
-                    }
740
-                    int lastRecordedLogId = int.Parse(result.ToString());
741
-
742
-                    if (lastRecordedLogId > lastSyncedLogId)
743
-                    {
744
-                        List<RemoteVendorEvent> eventList = new List<RemoteVendorEvent>();
745
-                        int counter = 0;
746
-                        using (var Command = db.CreateCommand("Select Id,UserId,VoucherId,EventDate,EventType From Logs WHERE Id > @id",
747
-                            new SQLiteParameter("@id", lastSyncedLogId)))
748
-                        {
749
-                            using (SQLiteDataReader read = Command.ExecuteReader())
750
-                            {
751
-                                while (read.Read())
752
-                                {
753
-                                    counter += 1;
754
-                                    var nextEvent = new RemoteVendorEvent();
755
-                                    nextEvent.Id = read.GetInt32(0);
756
-                                    nextEvent.UserId = read.GetInt32(1);
757
-                                    if (read.IsDBNull(2) == true)
758
-                                    {
759
-                                        nextEvent.VoucherId = null;
760
-                                    }
761
-                                    else
762
-                                    {
763
-                                        nextEvent.VoucherId = read.GetInt32(2);
764
-                                    }
765
-                                    nextEvent.EventDate = read.GetDateTime(3);
766
-                                    nextEvent.EventType = (VendorEvent.VendorEventType)Enum.Parse(typeof(VendorEvent.VendorEventType), read.GetValue(4).ToString());
767
-                                    nextEvent.VendorId = Globals.SessionData.Credentials.Payload.Vendor.id;
768
-                                    eventList.Add(nextEvent);
769
-
770
-                                    if (counter == uploadPageSize)
771
-                                    {
772
-                                        var response = new RemoteVendorEventResponse();
773
-                                        if (RESTRequest(eventList, ref response, "/api/vendorevents/"))
774
-                                        {
775
-                                            counter = 0;
776
-                                            eventList.Clear();
777
-                                        }
778
-                                        else
779
-                                        {
780
-                                            uploadFailed = true;
781
-                                            break;
782
-                                        }
783
-                                    }
784
-                                }
785
-                                if (counter > 0)
786
-                                {
787
-                                    var response = new RemoteVendorEventResponse();
788
-                                    if (!RESTRequest(eventList, ref response, "/api/vendorevents/"))
789
-                                    {
790
-                                        uploadFailed = true;
791
-                                    }
792
-                                }
793
-                            }
794
-                        }
795
-                    }
796
-
797
-                    lock (Globals.LogUploadThreadLock)
798
-                    {
799
-                        while (! Globals.LogUploadThreadCancelled && ! Globals.UploadNewLogs)
800
-                        {
801
-                            Monitor.Wait(Globals.LogUploadThreadLock, uploadFailed ? retryInterval : Timeout.Infinite);
802
-                            if (uploadFailed)
803
-                            {
804
-                                break;
805
-                            }
806
-                        }
807
-                        Globals.UploadNewLogs = false;
808
-                        cancelled = Globals.LogUploadThreadCancelled;
809
-                    }
810
-                }
811
-            }
812
-        }
813
-
814 713
         public static void TriggerLogUpload()
815 714
         {
816
-            if (Globals.LogUploadThread == null)
715
+            if (Globals.LogUploader == null)
817 716
             {
818
-                Globals.LogUploadThread = new Thread(() => LogUploadWorker());
819
-                Globals.LogUploadThread.Start();
717
+                Globals.LogUploader = new LogUploader(Globals.DB);
718
+                Globals.LogUploader.Start();
820 719
             }
821 720
             else
822 721
             {
823
-                lock (Globals.LogUploadThreadLock)
824
-                {
825
-                    Globals.UploadNewLogs = true;
826
-                    Monitor.Pulse(Globals.LogUploadThreadLock);
827
-                }
722
+                Globals.LogUploader.TriggerUpload();
828 723
             }
829 724
         }
830 725