ClientSuite: Add WorkerManager
This commit is contained in:
parent
269e64be50
commit
2b05e72c9e
@ -1,5 +1,4 @@
|
||||
Imports DigitalData.Modules.Logging
|
||||
Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
|
||||
Imports DigitalData.Modules.EDMIAPI.IDBServiceReference
|
||||
Imports System.ServiceModel
|
||||
Imports System.IO
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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>
|
||||
|
||||
63
GUIs.ClientSuite/Workers/HeartbeatWorker.vb
Normal file
63
GUIs.ClientSuite/Workers/HeartbeatWorker.vb
Normal 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
|
||||
|
||||
12
GUIs.ClientSuite/Workers/IWorker.vb
Normal file
12
GUIs.ClientSuite/Workers/IWorker.vb
Normal 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
|
||||
|
||||
70
GUIs.ClientSuite/Workers/WorkerManager.vb
Normal file
70
GUIs.ClientSuite/Workers/WorkerManager.vb
Normal 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
|
||||
|
||||
29
GUIs.ClientSuite/Workers/WorkflowWorker.vb
Normal file
29
GUIs.ClientSuite/Workers/WorkflowWorker.vb
Normal 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
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user