프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / MarkusLogview / SignalREngineServiceWindowsService / SignalREngineServiceWindowsService.cs @ 91b2b398

이력 | 보기 | 이력해설 | 다운로드 (13.7 KB)

1
using System;
2
using System.Data.Common;
3
using System.Diagnostics;
4
using System.Diagnostics.Contracts;
5
using System.Linq;
6
using System.Reflection;
7
using System.ServiceProcess;
8
using System.Threading;
9
using System.Timers;
10
using MarkusDataModel.Common;
11
using MarkusDataModel.DataModel;
12
using MarkusDataModel.DTOs;
13
using Microsoft.AspNet.SignalR.Client;
14
using ServiceInterface;
15
using SignalREngine;
16
using SignalREngineServiceWindowsService.HubConfig;
17
using TableDependency;
18
using TableDependency.EventArgs;
19
using TableDependency.SqlClient;
20

    
21
namespace SignalREngineServiceWindowsService
22
{
23
    class SignalREngineServiceWindowsService : ServiceBase
24
    {
25
        #region Default Configuration , Init variable
26

    
27
        /// <summary>
28
        /// Sql Table Dependency 
29
        /// </summary>
30
        private static SqlTableDependency<CONVERTER_DOC> _convertTableDependency;
31
        private static SqlTableDependency<FINAL_PDF> _finalTableDependency;
32
        private static string entityConnString = ConnectStringBuilder.MarkusConnectionString().ProviderConnectionString.ToString();
33
        private static string hubBaseURL = "http://localhost:8089";
34
        private static string hubName = "MarkusHub";
35
        private static ConvertSetting convSetting = new ConvertSetting();
36
        private static FinalSetting finalSetting = new FinalSetting();
37
        private static DetectedType detectedType = new DetectedType();
38

    
39
        /// <summary>
40
        /// Logger 
41
        /// </summary>
42
        private static ServiceEventLogger _serviceEventLogger = new ServiceEventLogger();
43

    
44
        /// <summary>
45
        /// Public Constructor for WindowsService.
46
        /// - Put all of your Initialization code here.
47
        /// </summary>
48
        public SignalREngineServiceWindowsService()
49
        {
50

    
51
            this.ServiceName = "SignalREngineServiceWindowsService";
52
            this.EventLog.Log = "Application";
53

    
54
            // These Flags set whether or not to handle that specific
55
            //  type of event. Set to true if you need it, false otherwise.
56
            this.CanHandlePowerEvent = true;
57
            this.CanHandleSessionChangeEvent = true;
58
            this.CanPauseAndContinue = true;
59
            this.CanShutdown = true;
60
            this.CanStop = true;
61

    
62
        }
63

    
64
        /// <summary>
65
        /// Dispose of objects that need it here.
66
        /// </summary>
67
        /// <param name="disposing">Whether
68
        ///    or not disposing is going on.</param>
69
        protected override void Dispose(bool disposing)
70
        {
71
            base.Dispose(disposing);
72
        }
73

    
74
        /// <summary>
75
        /// OnStart(): Put startup code here
76
        ///  - Start threads, get inital data, etc.
77
        /// </summary>
78
        /// <param name="args"></param>
79
        protected override void OnStart(string[] args)
80
        {
81

    
82
            AllStart_Service();
83
            base.OnStart(args);
84

    
85
        }
86
        #endregion
87

    
88
        #region service override method 
89
        /// <summary>
90
        /// OnStop(): Put your stop code here
91
        /// - Stop threads, set final data, etc.
92
        /// </summary>
93
        protected override void OnStop()
94
        {
95
            //this.timer.Stop();
96
            //this.timer = null;
97
            base.OnStop();
98
        }
99

    
100
        /// <summary>
101
        /// OnPause: Put your pause code here
102
        /// - Pause working threads, etc.
103
        /// </summary>
104
        protected override void OnPause()
105
        {
106
            base.OnPause();
107
        }
108

    
109
        /// <summary>
110
        /// OnContinue(): Put your continue code here
111
        /// - Un-pause working threads, etc.
112
        /// </summary>
113
        protected override void OnContinue()
114
        {
115
            base.OnContinue();
116
        }
117

    
118
        /// <summary>
119
        /// OnShutdown(): Called when the System is shutting down
120
        /// - Put code here when you need special handling
121
        ///   of code that deals with a system shutdown, such
122
        ///   as saving special data before shutdown.
123
        /// </summary>
124
        protected override void OnShutdown()
125
        {
126
            base.OnShutdown();
127
        }
128

    
129
        /// <summary>
130
        /// OnCustomCommand(): If you need to send a command to your
131
        ///   service without the need for Remoting or Sockets, use
132
        ///   this method to do custom methods.
133
        /// </summary>
134
        /// <param name="command">Arbitrary Integer between 128 & 256</param>
135
        protected override void OnCustomCommand(int command)
136
        {
137
            //  A custom command can be sent to a service by using this method:
138
            //#  int command = 128; //Some Arbitrary number between 128 & 256
139
            //#  ServiceController sc = new ServiceController("NameOfService");
140
            //#  sc.ExecuteCommand(command);
141

    
142
            base.OnCustomCommand(command);
143
        }
144

    
145
        /// <summary>
146
        /// OnPowerEvent(): Useful for detecting power status changes,
147
        ///   such as going into Suspend mode or Low Battery for laptops.
148
        /// </summary>
149
        /// <param name="powerStatus">The Power Broadcast Status
150
        /// (BatteryLow, Suspend, etc.)</param>
151
        protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
152
        {
153
            return base.OnPowerEvent(powerStatus);
154
        }
155

    
156
        /// <summary>
157
        /// OnSessionChange(): To handle a change event
158
        ///   from a Terminal Server session.
159
        ///   Useful if you need to determine
160
        ///   when a user logs in remotely or logs off,
161
        ///   or when someone logs into the console.
162
        /// </summary>
163
        /// <param name="changeDescription">The Session Change
164
        /// Event that occured.</param>
165
        protected override void OnSessionChange(
166
                  SessionChangeDescription changeDescription)
167
        {
168
            base.OnSessionChange(changeDescription);
169
        }
170

    
171
        private void InitializeComponent()
172
        {
173

    
174
        }
175
        #endregion
176

    
177
        #region Table Dependency Configuration 
178

    
179
        
180
        public static void DependencyRestart()
181
        {
182

    
183
            TimeSpan _waitTime = TimeSpan.FromSeconds(2);
184

    
185
            ServiceController _watcher = new ServiceController("SignalR_Watcher");
186

    
187
            Process[] watcher = Process.GetProcessesByName("SignalR_Server_Watcher");
188

    
189
            if ( watcher.Length > 0)
190
            {
191
                watcher[0].Kill();
192
                _serviceEventLogger.WriteEventEntry("singalR Server ::: signalr watcher Service kill ", EventLogEntryType.SuccessAudit);
193

    
194

    
195
                _watcher.Refresh();
196

    
197
                if ( _watcher.Status == ServiceControllerStatus.Running || _watcher.Status == ServiceControllerStatus.StartPending)
198
                {
199
                    _watcher.WaitForStatus(ServiceControllerStatus.Stopped);
200
                }
201

    
202
                _watcher.Start(new string[] { "Restart" });
203
                _watcher.WaitForStatus(ServiceControllerStatus.Running);
204

    
205
                _serviceEventLogger.WriteEventEntry("singalR Server ::: signalr watcher Service Restart ", EventLogEntryType.SuccessAudit);
206

    
207
            }
208
            else
209
            {
210
                _serviceEventLogger.WriteEventEntry("singalR Server :::  signalr watcher Service Not Found", EventLogEntryType.Error);
211
            }
212

    
213
        }
214

    
215
        public static void AllStart_Service()
216
        {
217

    
218
            ConvertDep();
219
            FinalDep();
220
            Startup.StartServer();
221

    
222
            _serviceEventLogger.WriteEventEntry(" AllStart_Service ", EventLogEntryType.SuccessAudit);
223

    
224
        }
225

    
226

    
227
        public static void ConvertDep()
228
        {
229

    
230
            try
231
            {
232
                
233
                var convertMapper = new ModelToTableMapper<CONVERTER_DOC>();
234
                convertMapper.AddMapping(s => s.CURRENT_PAGE, "CURRENT_PAGE");
235

    
236
                _convertTableDependency = new SqlTableDependency<CONVERTER_DOC>(entityConnString, "CONVERTER_DOC", convertMapper);
237

    
238
                // Registration Dependency Event 
239
                _convertTableDependency.OnError += SqlTableDependency_OnError;
240
                _convertTableDependency.OnChanged += Convert_SqlTableDependency_Changed;
241

    
242
                _convertTableDependency.Start();
243

    
244
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name + " start", EventLogEntryType.SuccessAudit);
245

    
246
            }
247
            catch (Exception ex)
248
            {
249
                _serviceEventLogger.WriteEventEntry("SQL Dependency ERROR " + MethodBase.GetCurrentMethod().Name + " : " + ex.Message, EventLogEntryType.Error);
250
                DependencyRestart();
251
                throw;
252
            }
253

    
254
        }
255

    
256
        public static void FinalDep()
257
        {
258

    
259
            try
260
            {
261
                var finalMapper = new ModelToTableMapper<FINAL_PDF>();
262
                finalMapper.AddMapping(s => s.CURRENT_PAGE, "CURRENT_PAGE");
263

    
264
                _finalTableDependency = new SqlTableDependency<FINAL_PDF>(entityConnString, "FINAL_PDF", finalMapper);
265

    
266
                _finalTableDependency.OnError += SqlTableDependency_OnError;
267
                _finalTableDependency.OnChanged += Final_SqlTableDependency_Changed;
268

    
269
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name + " start", EventLogEntryType.SuccessAudit);
270

    
271
                _finalTableDependency.Start();
272
            }
273
            catch (Exception ex)
274
            {
275
                _serviceEventLogger.WriteEventEntry("SQL Dependency ERROR " + MethodBase.GetCurrentMethod().Name + " : " + ex.Message, EventLogEntryType.Error);
276
                DependencyRestart();
277
                throw;
278
            }
279

    
280
        }
281

    
282
        public static void SqlTableDependency_OnError(object sender, ErrorEventArgs e)
283
        {
284
            _serviceEventLogger.WriteEventEntry(" SQL Dependency ERROR " + MethodBase.GetCurrentMethod().Name + " :: " + e.Message, EventLogEntryType.Error);
285
            DependencyRestart();
286
            throw e.Error;
287
        }
288

    
289
        #endregion
290

    
291
        #region Detection change data 
292

    
293
        /// <summary>
294
        /// 컨버팅 테이블 데이터 변경에 대한 이벤트 감지 메서드 
295
        /// </summary>
296
        /// <param name="sender"></param>
297
        /// <param name="e"></param>
298
        public static void Convert_SqlTableDependency_Changed(object sender, RecordChangedEventArgs<CONVERTER_DOC> e)
299
        {
300
            try
301
            {
302

    
303
                string changeType = e.ChangeType.ToString();
304
                DetectedMakrusConvertTable(e.ChangeType.ToString(), e.Entity);
305

    
306
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name + " changeType : " + changeType, EventLogEntryType.SuccessAudit);
307

    
308
            }
309
            catch (Exception ex)
310
            {
311
                _serviceEventLogger.WriteEventEntry("Convert_SqlTableDependency_Changed Error : " + ex, EventLogEntryType.Error);
312
                throw;
313
            }
314
        }
315

    
316
        /// <summary>
317
        /// 파이널 테이블 데이터 변경에 대한 이벤트 감지 메서드 
318
        /// </summary>
319
        /// <param name="sender"></param>
320
        /// <param name="e"></param>
321
        public static void Final_SqlTableDependency_Changed(object sender, RecordChangedEventArgs<FINAL_PDF> e)
322
        {
323
            try
324
            {
325
                string changeType = e.ChangeType.ToString();
326
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name + " changeType : " + changeType, EventLogEntryType.SuccessAudit);
327

    
328
                DetectedMakrusFinalTable(changeType, e.Entity);
329

    
330
            }
331
            catch (Exception ex)
332
            {
333
                _serviceEventLogger.WriteEventEntry("Final_SqlTableDependency_Changed Error : " + ex, EventLogEntryType.Error);
334
                throw;
335
            }
336
        }
337

    
338
        #endregion
339

    
340
        #region Markus hub invoke method 
341

    
342
        /// <summary>
343
        /// 컨버팅 테이블에 대한 허브 invoke 메서드 
344
        /// </summary>
345
        /// <param name="type"></param>
346
        /// <param name="data"></param>
347
        public static void DetectedMakrusConvertTable(string type, CONVERTER_DOC data)
348
        {
349

    
350
            using (var hubConn = new HubConnection(hubBaseURL))
351
            {
352

    
353
                var hub = hubConn.CreateHubProxy(hubName);
354

    
355
                hubConn.Start().Wait();
356

    
357
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name, EventLogEntryType.SuccessAudit);
358

    
359
                if (type == detectedType.DataInsert)
360
                {
361
                    hub.Invoke(convSetting.InvokeInsert , data);
362
                }
363
                else if (type == detectedType.DataUpdate)
364
                {
365
                    hub.Invoke(convSetting.InvokeChange, data);
366
                }
367
                else if (type == detectedType.DataDelete)
368
                {
369
                    hub.Invoke(convSetting.InvokeDelete, data);
370
                }
371

    
372
            }
373

    
374
        }
375

    
376
        /// <summary>
377
        /// 파이널 테이블에 대한 허브 invoke 메서드 
378
        /// </summary>
379
        /// <param name="type"></param>
380
        /// <param name="data"></param>
381
        public static void DetectedMakrusFinalTable(string type, FINAL_PDF data)
382
        {
383

    
384
            using (var hubConn = new HubConnection(hubBaseURL))
385
            {
386

    
387
                var hub = hubConn.CreateHubProxy(hubName);
388

    
389
                hubConn.Start().Wait();
390

    
391
                _serviceEventLogger.WriteEventEntry(MethodBase.GetCurrentMethod().Name, EventLogEntryType.SuccessAudit);
392

    
393
                if (type == detectedType.DataInsert)
394
                {
395
                    hub.Invoke(finalSetting.InvokeInsert, data);
396
                }
397
                else if (type == detectedType.DataUpdate)
398
                {
399
                    hub.Invoke(finalSetting.InvokeChange, data);
400
                }
401
                else if (type == detectedType.DataDelete)
402
                {
403
                    hub.Invoke(finalSetting.InvokeDelete, data);
404
                }
405

    
406
            }
407

    
408
        }
409

    
410
        #endregion
411
    }
412
}
클립보드 이미지 추가 (최대 크기: 500 MB)