This commit is contained in:
Digital Data - Marlon Schreiber 2019-06-04 09:10:47 +02:00
commit f5febac0e1
11 changed files with 198 additions and 99 deletions

View File

@ -1,5 +1,4 @@
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Imports DigitalData.Modules.EDMIAPI.IDBServiceReference
Imports System.ServiceModel
Imports System.IO

View File

@ -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

View File

@ -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.
''' </summary>
''' <seealso cref="ClassPanelManager"/>
''' <seealso cref="PanelManager"/>
''' <returns>A list of PanelInformation</returns>
Public Overridable Function GetInitialPanels() As List(Of PanelInfo)
Return New List(Of PanelInfo)

View File

@ -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

View File

@ -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

View File

@ -144,7 +144,6 @@
<Compile Include="ClassLayout.vb" />
<Compile Include="ClassPanelManager.vb" />
<Compile Include="ClassService.vb" />
<Compile Include="ClassTimer.vb" />
<Compile Include="ClassUIConfig.vb" />
<Compile Include="ClassUtils.vb" />
<Compile Include="Common\ClassCommon.vb" />
@ -194,6 +193,10 @@
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Panels\PanelInfo.vb" />
<Compile Include="Workers\HeartbeatWorker.vb" />
<Compile Include="Workers\IWorker.vb" />
<Compile Include="Workers\WorkerManager.vb" />
<Compile Include="Workers\WorkflowWorker.vb" />
<Compile Include="_TEST\DockManagerTest.Designer.vb">
<DependentUpon>DockManagerTest.vb</DependentUpon>
</Compile>

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,70 @@
Imports System.Timers
Imports DigitalData.GUIs.ClientSuite.Base
Imports DigitalData.Modules.Logging
Namespace Workers
Public Class WorkerManager
Inherits BaseClass
''' <summary>
''' List of workers that will be started.
''' </summary>
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

View File

@ -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

View File

@ -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)