ソースを参照

Move log download thread to LogDownloader class.

Brett Credo 8 年 前
コミット
5feead915a

+ 2 - 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="LogDownloader.cs" />
166 167
     <Compile Include="LogUploader.cs" />
167 168
     <Compile Include="Migrations.cs" />
168 169
     <Compile Include="ObservedForm.cs">
@@ -210,6 +211,7 @@
210 211
     <Compile Include="ProgressDialog.Designer.cs">
211 212
       <DependentUpon>ProgressDialog.cs</DependentUpon>
212 213
     </Compile>
214
+    <Compile Include="ThreadHelper.cs" />
213 215
     <Compile Include="Utility.cs" />
214 216
     <Compile Include="Models.cs" />
215 217
     <Compile Include="OrderForm.cs">

+ 1 - 3
BulkPrinting/BulkPrinting/Globals.cs

@@ -21,8 +21,6 @@ namespace BulkPrinting
21 21
         public static List<int> OpenBatches;
22 22
         public static UserLimits UserCurrentUsage;
23 23
         public static LogUploader LogUploader;
24
-        public static Thread LogDownloadThread;
25
-        public static object LogDownloadThreadLock = new object();
26
-        public static bool LogDownloadThreadCancelled;
24
+        public static LogDownloader LogDownloader;
27 25
     }
28 26
 }

+ 90 - 0
BulkPrinting/BulkPrinting/LogDownloader.cs

@@ -0,0 +1,90 @@
1
+using System;
2
+using System.Threading;
3
+
4
+namespace BulkPrinting
5
+{
6
+    public class LogDownloader : ThreadHelper
7
+    {
8
+        private const int _vendorEventPageSize = 5000;
9
+        private const int _retryInterval = 30000;
10
+
11
+        private DBHelper _db;
12
+
13
+        public LogDownloader(DBHelper db)
14
+        {
15
+            _db = db;
16
+        }
17
+
18
+        protected override void Run()
19
+        {
20
+            bool isCancelled = false;
21
+            int maxRemoteId = Utility.GetSavedParameterAsInt(_db, "SyncBackwardsFromLogId");
22
+            while (!isCancelled && (maxRemoteId > 0))
23
+            {
24
+                var EventPage = new Page<VendorEvent>();
25
+                if (Utility.RESTRequest(ref EventPage, String.Format(
26
+                    "/api/vendorevents/?maxRemoteId={0}&pageSize={1}", maxRemoteId, _vendorEventPageSize)))
27
+                {
28
+                    lock (_db.WriteLock)
29
+                    {
30
+                        using (var trans = _db.BeginTransaction())
31
+                        {
32
+                            using (var insertCommand = _db.CreateCommand(
33
+                                "INSERT INTO Logs (Id,  UserId,  VoucherId,  EventDate,  EventType,  Retry) " +
34
+                                          "VALUES (@id, @userid, @voucherid, @eventdate, @eventtype, @retry)",
35
+                                trans))
36
+                            using (var updateCommand = _db.CreateCommand(
37
+                                "UPDATE Parameters SET Value=@Value WHERE Key='SyncBackwardsFromLogId'", trans))
38
+                            {
39
+                                foreach (VendorEvent Event in EventPage.Items)
40
+                                {
41
+                                    if (!Event.RemoteId.HasValue)
42
+                                    {
43
+                                        throw new Exception("Downloaded event with no remote ID");
44
+                                    }
45
+                                    else if (Event.RemoteId.Value > maxRemoteId)
46
+                                    {
47
+                                        throw new Exception("Downloaded event remote ID was not in descending order");
48
+                                    }
49
+
50
+                                    insertCommand.Parameters.Clear();
51
+                                    insertCommand.Parameters.AddWithValue("@id", Event.RemoteId);
52
+                                    insertCommand.Parameters.AddWithValue("@userid", Event.UserId);
53
+                                    insertCommand.Parameters.AddWithValue("@voucherid", Event.VoucherId);
54
+                                    insertCommand.Parameters.AddWithValue("@eventdate", Event.EventDate.UtcDateTime);
55
+                                    insertCommand.Parameters.AddWithValue("@eventtype", Event.EventType);
56
+                                    insertCommand.Parameters.AddWithValue("@retry", Event.Retry);
57
+                                    insertCommand.ExecuteNonQuery();
58
+
59
+                                    maxRemoteId = Event.RemoteId.Value - 1;
60
+                                }
61
+
62
+                                updateCommand.Parameters.Clear();
63
+                                updateCommand.Parameters.AddWithValue("@Value", maxRemoteId.ToString());
64
+                                updateCommand.ExecuteNonQuery();
65
+                            }
66
+
67
+                            trans.Commit();
68
+                        }
69
+                    }
70
+
71
+                    lock (_lock)
72
+                    {
73
+                        isCancelled = _cancelled;
74
+                    }
75
+                }
76
+                else
77
+                {
78
+                    lock (_lock)
79
+                    {
80
+                        if (!_cancelled)
81
+                        {
82
+                            Monitor.Wait(_lock, _retryInterval);
83
+                        }
84
+                        isCancelled = _cancelled;
85
+                    }
86
+                }
87
+            }
88
+        }
89
+    }
90
+}

+ 2 - 25
BulkPrinting/BulkPrinting/LogUploader.cs

@@ -5,38 +5,20 @@ using System.Threading;
5 5
 
6 6
 namespace BulkPrinting
7 7
 {
8
-    public class LogUploader
8
+    public class LogUploader : ThreadHelper
9 9
     {
10 10
         private const int _uploadPageSize = 5000;
11 11
         private const int _retryInterval = 30000;
12 12
 
13
-        private Thread _thread;
14
-        private object _lock = new object();
15 13
         private DBHelper _db;
16
-        private bool _cancelled;
17 14
         private bool _uploadTriggered;
18 15
 
19 16
         public LogUploader(DBHelper db)
20 17
         {
21 18
             _db = db;
22
-            _thread = new Thread(Run);
23 19
         }
24 20
 
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()
21
+        protected override void Run()
40 22
         {
41 23
             var isCancelled = false;
42 24
             while (!isCancelled)
@@ -123,11 +105,6 @@ namespace BulkPrinting
123 105
             }
124 106
         }
125 107
 
126
-        public void Start()
127
-        {
128
-            _thread.Start();
129
-        }
130
-
131 108
         public void TriggerUpload()
132 109
         {
133 110
             lock (_lock)

+ 42 - 0
BulkPrinting/BulkPrinting/ThreadHelper.cs

@@ -0,0 +1,42 @@
1
+using System.Threading;
2
+
3
+namespace BulkPrinting
4
+{
5
+    public abstract class ThreadHelper
6
+    {
7
+        protected Thread _thread;
8
+        protected object _lock = new object();
9
+        protected bool _cancelled;
10
+
11
+        public ThreadHelper()
12
+        {
13
+            _thread = new Thread(Run);
14
+        }
15
+
16
+        public void Abort()
17
+        {
18
+            _thread.Abort();
19
+        }
20
+
21
+        public void Cancel()
22
+        {
23
+            lock (_lock)
24
+            {
25
+                _cancelled = true;
26
+                Monitor.Pulse(_lock);
27
+            }
28
+        }
29
+
30
+        public void Join()
31
+        {
32
+            _thread.Join();
33
+        }
34
+
35
+        protected abstract void Run();
36
+
37
+        public void Start()
38
+        {
39
+            _thread.Start();
40
+        }
41
+    }
42
+}

+ 8 - 96
BulkPrinting/BulkPrinting/Utility.cs

@@ -536,7 +536,8 @@ namespace BulkPrinting
536 536
                 if (Globals.LogUploader != null)
537 537
                     Globals.LogUploader.Cancel();
538 538
 
539
-                CancelLogDownloadWorker();
539
+                if (Globals.LogDownloader != null)
540
+                    Globals.LogDownloader.Cancel();
540 541
 
541 542
                 if (Globals.LogUploader != null)
542 543
                 {
@@ -544,14 +545,12 @@ namespace BulkPrinting
544 545
                     Globals.LogUploader = null;
545 546
                 }
546 547
 
547
-                if (Globals.LogDownloadThread != null)
548
+                if (Globals.LogDownloader != null)
548 549
                 {
549
-                    Globals.LogDownloadThread.Join();
550
-                    Globals.LogDownloadThread = null;
550
+                    Globals.LogDownloader.Join();
551
+                    Globals.LogDownloader = null;
551 552
                 }
552 553
 
553
-                Globals.LogDownloadThreadCancelled = false;
554
-
555 554
                 Globals.DB.Close();
556 555
                 Globals.DB.Dispose();
557 556
                 Globals.DB = null;
@@ -614,99 +613,12 @@ namespace BulkPrinting
614 613
             }
615 614
         }
616 615
 
617
-        public static void CancelLogDownloadWorker()
618
-        {
619
-            lock (Globals.LogDownloadThreadLock)
620
-            {
621
-                Globals.LogDownloadThreadCancelled = true;
622
-                Monitor.Pulse(Globals.LogDownloadThreadLock);
623
-            }
624
-        }
625
-
626
-        public static void LogDownloadWorker()
627
-        {
628
-            const int vendorEventPageSize = 1000;
629
-            const int retryInterval = 30000;
630
-
631
-            var db = Globals.DB;
632
-            //using (var db = OpenDBConnection())
633
-            {
634
-                bool cancelled = false;
635
-                int maxRemoteId = GetSavedParameterAsInt(db, "SyncBackwardsFromLogId");
636
-                while (!cancelled && (maxRemoteId > 0))
637
-                {
638
-                    var EventPage = new Page<VendorEvent>();
639
-                    if (RESTRequest(ref EventPage, String.Format("/api/vendorevents/?maxRemoteId={0}&pageSize={1}", maxRemoteId, vendorEventPageSize)))
640
-                    {
641
-                        lock (db.WriteLock)
642
-                        {
643
-                            using (var trans = db.BeginTransaction())
644
-                            {
645
-                                using (var insertCommand = db.CreateCommand(
646
-                                    "INSERT INTO Logs (Id,  UserId,  VoucherId,  EventDate,  EventType,  Retry) " +
647
-                                              "VALUES (@id, @userid, @voucherid, @eventdate, @eventtype, @retry)",
648
-                                    trans))
649
-                                using (var updateCommand = db.CreateCommand(
650
-                                    "UPDATE Parameters SET Value=@Value WHERE Key='SyncBackwardsFromLogId'", trans))
651
-                                {
652
-                                    foreach (VendorEvent Event in EventPage.Items)
653
-                                    {
654
-                                        if (!Event.RemoteId.HasValue)
655
-                                        {
656
-                                            throw new Exception("Downloaded event with no remote ID");
657
-                                        }
658
-                                        else if (Event.RemoteId.Value > maxRemoteId)
659
-                                        {
660
-                                            throw new Exception("Downloaded event remote ID was not in descending order");
661
-                                        }
662
-
663
-                                        insertCommand.Parameters.Clear();
664
-                                        insertCommand.Parameters.AddWithValue("@id", Event.RemoteId);
665
-                                        insertCommand.Parameters.AddWithValue("@userid", Event.UserId);
666
-                                        insertCommand.Parameters.AddWithValue("@voucherid", Event.VoucherId);
667
-                                        insertCommand.Parameters.AddWithValue("@eventdate", Event.EventDate.UtcDateTime);
668
-                                        insertCommand.Parameters.AddWithValue("@eventtype", Event.EventType);
669
-                                        insertCommand.Parameters.AddWithValue("@retry", Event.Retry);
670
-                                        insertCommand.ExecuteNonQuery();
671
-
672
-                                        maxRemoteId = Event.RemoteId.Value - 1;
673
-                                    }
674
-
675
-                                    updateCommand.Parameters.Clear();
676
-                                    updateCommand.Parameters.AddWithValue("@Value", maxRemoteId.ToString());
677
-                                    updateCommand.ExecuteNonQuery();
678
-                                }
679
-
680
-                                trans.Commit();
681
-                            }
682
-                        }
683
-
684
-                        lock (Globals.LogDownloadThreadLock)
685
-                        {
686
-                            cancelled = Globals.LogDownloadThreadCancelled;
687
-                        }
688
-                    }
689
-                    else
690
-                    {
691
-                        lock (Globals.LogDownloadThreadLock)
692
-                        {
693
-                            if (!Globals.LogDownloadThreadCancelled)
694
-                            {
695
-                                Monitor.Wait(Globals.LogDownloadThreadLock, retryInterval);
696
-                            }
697
-                            cancelled = Globals.LogDownloadThreadCancelled;
698
-                        }
699
-                    }
700
-                }
701
-            }
702
-        }
703
-
704 616
         public static void TriggerLogDownload()
705 617
         {
706
-            if (Globals.LogDownloadThread == null)
618
+            if (Globals.LogDownloader == null)
707 619
             {
708
-                Globals.LogDownloadThread = new Thread(() => LogDownloadWorker());
709
-                Globals.LogDownloadThread.Start();
620
+                Globals.LogDownloader = new LogDownloader(Globals.DB);
621
+                Globals.LogDownloader.Start();
710 622
             }
711 623
         }
712 624