From 2b05e72c9e63b31d4b80f9891ddf906a3d6799e0 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 3 Jun 2019 14:18:43 +0200 Subject: [PATCH] ClientSuite: Add WorkerManager --- EDMI_FILE_OPs/Document.vb | 1 - GUIs.ClientSuite/Base/BaseForm.vb | 21 ++----- GUIs.ClientSuite/Base/BaseRibbonForm.vb | 2 +- GUIs.ClientSuite/ClassPanelManager.vb | 2 +- GUIs.ClientSuite/ClassTimer.vb | 67 -------------------- GUIs.ClientSuite/ClientSuite.vbproj | 5 +- GUIs.ClientSuite/Workers/HeartbeatWorker.vb | 63 +++++++++++++++++++ GUIs.ClientSuite/Workers/IWorker.vb | 12 ++++ GUIs.ClientSuite/Workers/WorkerManager.vb | 70 +++++++++++++++++++++ GUIs.ClientSuite/Workers/WorkflowWorker.vb | 29 +++++++++ GUIs.ClientSuite/frmMain.vb | 25 ++++---- 11 files changed, 198 insertions(+), 99 deletions(-) delete mode 100644 GUIs.ClientSuite/ClassTimer.vb create mode 100644 GUIs.ClientSuite/Workers/HeartbeatWorker.vb create mode 100644 GUIs.ClientSuite/Workers/IWorker.vb create mode 100644 GUIs.ClientSuite/Workers/WorkerManager.vb create mode 100644 GUIs.ClientSuite/Workers/WorkflowWorker.vb diff --git a/EDMI_FILE_OPs/Document.vb b/EDMI_FILE_OPs/Document.vb index d5363bcb..d3f57042 100644 --- a/EDMI_FILE_OPs/Document.vb +++ b/EDMI_FILE_OPs/Document.vb @@ -1,5 +1,4 @@ Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference Imports DigitalData.Modules.EDMIAPI.IDBServiceReference Imports System.ServiceModel Imports System.IO diff --git a/GUIs.ClientSuite/Base/BaseForm.vb b/GUIs.ClientSuite/Base/BaseForm.vb index 8bde5fd9..3287035d 100644 --- a/GUIs.ClientSuite/Base/BaseForm.vb +++ b/GUIs.ClientSuite/Base/BaseForm.vb @@ -15,14 +15,9 @@ Namespace Base Public Class BaseForm Inherits Form - Private ReadOnly _Logger As Logger Private ReadOnly _ErrorHandler As ClassErrorHandler Protected ReadOnly Property Logger As Logger - Get - Return _Logger - End Get - End Property Public Sub New() ' Get the full name of the inheriting form @@ -30,8 +25,8 @@ Namespace Base Dim oClassName = [GetType]().FullName ' My.LogConfig is undefined in the designer - _Logger = My.LogConfig?.GetLogger(oClassName) - _ErrorHandler = New ClassErrorHandler(_Logger) + Logger = My.LogConfig?.GetLogger(oClassName) + _ErrorHandler = New ClassErrorHandler(Logger) ' When you add something, be careful if it ' depends on a global var like My.LogConfig @@ -43,18 +38,14 @@ Namespace Base End Sub Private Sub InitializeComponent() - Me.SuspendLayout() + SuspendLayout() ' 'BaseForm ' - Me.ClientSize = New System.Drawing.Size(284, 261) - Me.Name = "BaseForm" - Me.ResumeLayout(False) - - End Sub - - Private Sub BaseForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load + ClientSize = New Size(284, 261) + Name = "BaseForm" + ResumeLayout(False) End Sub End Class End Namespace diff --git a/GUIs.ClientSuite/Base/BaseRibbonForm.vb b/GUIs.ClientSuite/Base/BaseRibbonForm.vb index 20a32fa4..290af614 100644 --- a/GUIs.ClientSuite/Base/BaseRibbonForm.vb +++ b/GUIs.ClientSuite/Base/BaseRibbonForm.vb @@ -85,7 +85,7 @@ Namespace Base ''' This can be overridden by all inheriting forms to extend the list of panels ''' Panels will be created by PanelManager. ''' - ''' + ''' ''' A list of PanelInformation Public Overridable Function GetInitialPanels() As List(Of PanelInfo) Return New List(Of PanelInfo) diff --git a/GUIs.ClientSuite/ClassPanelManager.vb b/GUIs.ClientSuite/ClassPanelManager.vb index 30a753a8..123e831e 100644 --- a/GUIs.ClientSuite/ClassPanelManager.vb +++ b/GUIs.ClientSuite/ClassPanelManager.vb @@ -6,7 +6,7 @@ Imports DevExpress.XtraGrid Imports DigitalData.GUIs.ClientSuite.Base Imports DigitalData.Modules.Logging -Public Class ClassPanelManager +Public Class PanelManager Private _logger As Logger Private _logConfig As LogConfig diff --git a/GUIs.ClientSuite/ClassTimer.vb b/GUIs.ClientSuite/ClassTimer.vb deleted file mode 100644 index 48d2d61f..00000000 --- a/GUIs.ClientSuite/ClassTimer.vb +++ /dev/null @@ -1,67 +0,0 @@ -Imports System.ServiceModel -Imports System.Threading -Imports System.Timers -Imports DigitalData.GUIs.ClientSuite.Base -Imports DigitalData.Modules.EDMIAPI.IDBServiceReference -Imports DigitalData.Modules.Logging - -Public Class ClassTimer - Inherits BaseClass - - Private _Callback As TimerCallback - Private _LogConfig As LogConfig - Private _Logger As Logger - Private _Timer As Timers.Timer - Private _Channel As IIDBServiceChannel - - Public Event OnlineChanged As OnlineChangedEventHandler - Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) - - Public Sub New(LogConfig As LogConfig, SynchronizingObject As frmMain, HeartbeatInterval As Integer) - MyBase.New(LogConfig) - - Try - _Channel = My.ChannelFactory.CreateChannel() - _Channel.Open() - - _Timer = New Timers.Timer(HeartbeatInterval) With { - .SynchronizingObject = SynchronizingObject, - .Enabled = True - } - - AddHandler _Timer.Elapsed, AddressOf Callback - Catch ex As Exception - Logger.Error(ex) - End Try - End Sub - - Public Async Sub Callback(sender As Object, e As ElapsedEventArgs) - Try - Logger.Debug("Checking if Service is up...") - - If _Channel.State = ServiceModel.CommunicationState.Faulted Then - _Channel = My.ChannelFactory.CreateChannel() - End If - - ' Connect to service and send hearbeat request - Dim oResult = Await _Channel.HeartbeatAsync() - - Logger.Debug("Service is online") - - SetOnlineState(True) - Catch ex As Exception - Logger.Debug("Service is offline!") - - SetOnlineState(False) - Finally - My.Application.Service.LastChecked = DateTime.Now - End Try - End Sub - - Private Sub SetOnlineState(NewState As Boolean) - If My.Application.Service.Online <> NewState Then - My.Application.Service.Online = NewState - RaiseEvent OnlineChanged(Me, NewState) - End If - End Sub -End Class diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index 6f126011..61088e0f 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -144,7 +144,6 @@ - @@ -194,6 +193,10 @@ UserControl + + + + DockManagerTest.vb diff --git a/GUIs.ClientSuite/Workers/HeartbeatWorker.vb b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb new file mode 100644 index 00000000..7bba52ba --- /dev/null +++ b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb @@ -0,0 +1,63 @@ +Imports System.Timers +Imports DigitalData.GUIs.ClientSuite +Imports DigitalData.GUIs.ClientSuite.Base +Imports DigitalData.Modules.EDMIAPI.IDBServiceReference +Imports DigitalData.Modules.Logging +Namespace Workers + Public Class HeartbeatWorker + Inherits BaseClass + Implements IWorker + + Private _Channel As IIDBServiceChannel + + Public Event OnlineChanged As OnlineChangedEventHandler + Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) + + Public ReadOnly Property Interval As Integer = 4000 Implements IWorker.Interval + + Public Sub New(LogConfig As LogConfig) + MyBase.New(LogConfig) + End Sub + + Public Sub Setup() Implements IWorker.Setup + _Channel = My.ChannelFactory.CreateChannel() + _Channel.Open() + End Sub + + Public Async Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback + Try + Logger.Debug("Checking if Service is up...") + + If _Channel.State = ServiceModel.CommunicationState.Faulted Then + _Channel = My.ChannelFactory.CreateChannel() + End If + + ' Connect to service and send hearbeat request + Dim oResult = Await _Channel.HeartbeatAsync() + + Logger.Debug("Service is online") + + SetOnlineState(True) + Catch ex As Exception + Logger.Debug("Service is offline!") + Logger.Error(ex) + + SetOnlineState(False) + Finally + My.Application.Service.LastChecked = DateTime.Now + End Try + End Sub + + Public Sub Teardown() Implements IWorker.Teardown + ' TODO: Close channel gracefully + End Sub + + Private Sub SetOnlineState(NewState As Boolean) + If My.Application.Service.Online <> NewState Then + My.Application.Service.Online = NewState + RaiseEvent OnlineChanged(Me, NewState) + End If + End Sub + End Class +End Namespace + diff --git a/GUIs.ClientSuite/Workers/IWorker.vb b/GUIs.ClientSuite/Workers/IWorker.vb new file mode 100644 index 00000000..9405ca10 --- /dev/null +++ b/GUIs.ClientSuite/Workers/IWorker.vb @@ -0,0 +1,12 @@ +Imports System.Timers + +Namespace Workers + Public Interface IWorker + ReadOnly Property Interval As Integer + + Sub Setup() + Sub Teardown() + Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) + End Interface +End Namespace + diff --git a/GUIs.ClientSuite/Workers/WorkerManager.vb b/GUIs.ClientSuite/Workers/WorkerManager.vb new file mode 100644 index 00000000..f228d535 --- /dev/null +++ b/GUIs.ClientSuite/Workers/WorkerManager.vb @@ -0,0 +1,70 @@ +Imports System.Timers +Imports DigitalData.GUIs.ClientSuite.Base +Imports DigitalData.Modules.Logging + +Namespace Workers + Public Class WorkerManager + Inherits BaseClass + + ''' + ''' List of workers that will be started. + ''' + Private WorkerTypes As New List(Of Type) From { + GetType(HeartbeatWorker) + } + Private Workers As New List(Of IWorker) + Private TimerList As New List(Of Timer) + + Public Sub New(LogConfig As LogConfig, SyncronizingObject As frmMain) + MyBase.New(LogConfig) + + Workers = CreateWorkers() + + For Each oWorker As IWorker In Workers + Dim oTimer = New Timer(oWorker.Interval) With { + .SynchronizingObject = SyncronizingObject, + .Enabled = True + } + + AddHandler oTimer.Elapsed, Sub(sender As Object, e As ElapsedEventArgs) + Try + oWorker.Callback(Me, e) + Catch ex As Exception + Logger.Warn("Worker {0} threw an error in callback.", oWorker.GetType.Name) + End Try + End Sub + + TimerList.Add(oTimer) + Next + End Sub + + Public Function GetWorker(Of T)() As T + For Each oWorker In Workers + If TypeOf oWorker Is T Then + Return oWorker + End If + Next + + Return Nothing + End Function + + Private Function CreateWorkers() As List(Of IWorker) + Dim oWorkers As New List(Of IWorker) + + For Each oWorkerType In WorkerTypes + Try + Dim oWorker As IWorker = Activator.CreateInstance(oWorkerType, New Object() {LogConfig}) + oWorker.Setup() + oWorkers.Add(oWorker) + Catch ex As Exception + Logger.Warn("Worker {0} threw an error while creating. Skipping.", oWorkerType.Name) + Logger.Error(ex) + Continue For + End Try + Next + + Return oWorkers + End Function + End Class +End Namespace + diff --git a/GUIs.ClientSuite/Workers/WorkflowWorker.vb b/GUIs.ClientSuite/Workers/WorkflowWorker.vb new file mode 100644 index 00000000..dc2a9fc1 --- /dev/null +++ b/GUIs.ClientSuite/Workers/WorkflowWorker.vb @@ -0,0 +1,29 @@ +Imports System.Timers +Imports DigitalData.GUIs.ClientSuite.Base +Imports DigitalData.Modules.Logging + +Namespace Workers + Public Class WorkflowWorker + Inherits BaseClass + Implements IWorker + + Public Sub New(LogConfig As LogConfig) + MyBase.New(LogConfig) + End Sub + + Public ReadOnly Property Interval As Integer = 60000 Implements IWorker.Interval + + Public Sub Setup() Implements IWorker.Setup + Throw New NotImplementedException() + End Sub + + Public Sub Teardown() Implements IWorker.Teardown + Throw New NotImplementedException() + End Sub + + Public Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback + Throw New NotImplementedException() + End Sub + End Class +End Namespace + diff --git a/GUIs.ClientSuite/frmMain.vb b/GUIs.ClientSuite/frmMain.vb index 1c7662a9..a175c282 100644 --- a/GUIs.ClientSuite/frmMain.vb +++ b/GUIs.ClientSuite/frmMain.vb @@ -1,18 +1,16 @@ -Imports DevExpress.XtraBars.Docking2010 +Imports System.IO Imports System.ComponentModel -Imports DigitalData.GUIs.ClientSuite.ClassLayout -Imports System.IO -Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.License +Imports DevExpress.XtraBars.Docking2010 Imports DevExpress.LookAndFeel Imports DevExpress.XtraBars.Ribbon -Imports DevExpress.XtraBars.Docking -Imports DevExpress.XtraGrid -Imports DevExpress.XtraBars.Docking2010.Views +Imports DigitalData.GUIs.ClientSuite.ClassLayout +Imports DigitalData.GUIs.ClientSuite.Workers +Imports DigitalData.Modules.License Public Class frmMain - Private _PanelManager As ClassPanelManager + Private _PanelManager As PanelManager Private _Timer As ClassTimer + Private _WorkerManager As WorkerManager Private _Loading As Boolean = True Public Sub New() @@ -45,12 +43,13 @@ Public Class frmMain Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load Try - ' Initialize Main Timer - _Timer = New ClassTimer(My.LogConfig, Me, My.SysConfig.HeartbeatInterval) - AddHandler _Timer.OnlineChanged, AddressOf HandleOnlineChanged + ' Initialize Worker Manager + _WorkerManager = New WorkerManager(My.LogConfig, Me) + Dim oHeartbeatWorker = _WorkerManager.GetWorker(Of HeartbeatWorker)() + AddHandler oHeartbeatWorker.OnlineChanged, AddressOf HandleOnlineChanged ' Initialize Panel Manager - _PanelManager = New ClassPanelManager(My.LogConfig, DocumentManager, DockManager) + _PanelManager = New PanelManager(My.LogConfig, DocumentManager, DockManager) ' Show Service Status Label SetOnlineLabel(True)