Files
Monorepo/Service.EDMIService/Scheduler/Scheduler.vb
Developer01 9901b48b80 Verbesserung der Protokollierung und Konfigurationsbereinigung
Die Änderungen umfassen:

- Anpassung der `App.config`: Entfernen veralteter Einstellungen (`FB_DATABASE`, `FB_USER`, etc.) und Hinzufügen neuer Platzhalter (`Test`).
- Verbesserte Fehlerbehandlung und Protokollierung in `Form1.vb`, `WindowsService.vb` und anderen Klassen.
- Konsistente Verwendung von Symbolen (✔, ⚠) zur Hervorhebung von Erfolgen und Warnungen.
- Aktualisierung der `Settings.settings` und Bereinigung nicht mehr benötigter Konfigurationswerte.
- Downgrade von `Microsoft.Data.SqlClient` von Version 7.0.1 auf 5.2.2.
- Entfernung redundanter Module und Codeabschnitte zur Verbesserung der Wartbarkeit.
- Verbesserte Fehlerbehandlung beim Starten und Stoppen des ServiceHosts.
- Optimierung der Protokollmeldungen für Debugging und Performance-Analysen.
2026-09-22 16:42:07 +02:00

141 lines
5.1 KiB
VB.net

Imports System.Collections.Specialized
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
Imports Quartz
Imports Quartz.Impl
Imports Quartz.Impl.Matchers
Imports Quartz.Logging
Public Class Scheduler
Inherits BaseClass
Private ReadOnly _Factory As StdSchedulerFactory
Private ReadOnly _MSSQL As MSSQLServer
Private _Scheduler As IScheduler
Private ReadOnly _JobListener As JobListener
Private ReadOnly _GlobalState As GlobalState ' ✅ NEU
Private ReadOnly _Props = New NameValueCollection From {
{"quartz.serializer.type", "binary"},
{"quartz.threadPool.maxConcurrency", 3}
}
Private Const JOB_GROUP As String = "DatatableJobs"
Public Sub New(pLogConfig As LogConfig, pMSSQL_Config As MSSQLServer, pTableStore As DataSet, pGlobalState As GlobalState)
MyBase.New(pLogConfig)
_Factory = New StdSchedulerFactory(_Props)
_MSSQL = pMSSQL_Config
_JobListener = New JobListener(pLogConfig, _MSSQL, pTableStore)
_GlobalState = pGlobalState
_GlobalState.JobListener = _JobListener
Logger.Debug("JobListener registered in GlobalState")
Logging.LogProvider.SetCurrentLogProvider(New LogProvider(Logger))
End Sub
Public Async Sub Start()
' Get new scheduler
_Scheduler = Await _Factory.GetScheduler()
' configure it
_Scheduler.ListenerManager.AddJobListener(_JobListener,
GroupMatcher(Of JobKey).GroupEquals(JOB_GROUP))
' start it
Await _Scheduler.Start()
Dim oCronjobs As DataTable = Await GetCronJobs()
Try
If oCronjobs IsNot Nothing Then
Logger.Debug("Loaded {0} cron jobs", oCronjobs.Rows.Count)
For Each oRow As DataRow In oCronjobs.Rows
Dim oDefinition As String = oRow.Item("CRON_DEFINITION")
Dim oTitle As String = oRow.Item("TITLE")
Dim oGuid As Integer = oRow.Item("GUID")
Logger.Debug("Trying to schedule a new job forr Cron Job [{0}] ...", oTitle)
Dim oCronTrigger As ITrigger
Dim oInitTrigger As ITrigger
Dim oJob As IJobDetail
Dim oInitJob As IJobDetail
Dim oJobData As New JobDataMap From {
{"LogConfig", LogConfig},
{"MSSQL", _MSSQL},
{"CronJobId", oGuid},
{"CronJobTitle", oTitle}
}
Dim oIdentity As String = $"CRON-JOB-{oGuid}"
oCronTrigger = TriggerBuilder.Create().
WithIdentity(oIdentity & "-TRIGGER", JOB_GROUP).
WithCronSchedule(oDefinition).
Build()
oJob = JobBuilder.Create(Of DatatableJob)().
WithIdentity(oIdentity, JOB_GROUP).
UsingJobData(oJobData).
Build()
Await _Scheduler.ScheduleJob(oJob, oCronTrigger)
' Also create variant of the job that runs immediately, once
Dim oInitIdentity As String = $"CRON-JOB-INIT-{oGuid}"
oInitTrigger = TriggerBuilder.Create().
WithIdentity(oInitIdentity & "-TRIGGER", JOB_GROUP).
StartNow().
Build()
oInitJob = JobBuilder.Create(Of DatatableJob)().
WithIdentity(oInitIdentity, JOB_GROUP).
UsingJobData(oJobData).
Build()
Await _Scheduler.ScheduleJob(oInitJob, oInitTrigger)
Logger.Debug("Scheduled a new job for Cron Job [{0}]", oTitle)
Next
Logger.Info("✔ Scheduler started with {0} cron jobs", oCronjobs.Rows.Count)
Else
Logger.Warn("⚠ CronJobs could not be fetched!")
End If
Catch ex As Exception
Logger.Error(ex)
Logger.Warn("⚠ Unexpected Error while setting up scheduler: " & ex.Message)
End Try
End Sub
Public Async Function GetCronJobs() As Task(Of DataTable)
Try
Dim oSQL As String = "SELECT * FROM TBAPPSERV_CRON_JOB WITH (NOLOCK) WHERE ACTIVE = 1"
Dim oDatatable As DataTable = Await _MSSQL.GetDatatableAsync(oSQL)
Return oDatatable
Catch ex As Exception
Return Nothing
End Try
End Function
Public Async Function GetCronJobDetails(CronJobId As Integer) As Task(Of DataTable)
Try
Dim oSQL As String = $"SELECT * FROM TBAPPSERV_CRON_DETAIL WITH (NOLOCK) WHERE CRON_ID = {CronJobId}"
Dim oDatatable As DataTable = Await _MSSQL.GetDatatableAsync(oSQL)
Return oDatatable
Catch ex As Exception
Return Nothing
End Try
End Function
Public Async Sub [Stop]()
Await _Scheduler.Shutdown()
End Sub
End Class