diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index 6ab1d49f..8f630a08 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -1,6 +1,5 @@ Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.Filesystem Imports DigitalData.Modules.Language Imports DigitalData.Modules Imports System.IO @@ -8,7 +7,6 @@ Imports System.ServiceModel Imports System.Data.SqlClient Imports DigitalData.Services.EDMIService.Results Imports System.ServiceModel.Description -Imports System.ServiceModel.Channels Public Class EDMIService diff --git a/Service.EDMIService/Scheduler.vb b/Service.EDMIService/Scheduler.vb index 102b15d7..73745682 100644 --- a/Service.EDMIService/Scheduler.vb +++ b/Service.EDMIService/Scheduler.vb @@ -59,48 +59,28 @@ Public Class Scheduler Dim oDefinition As String = oRow.Item("CRON_DEFINITION") Dim oTitle As String = oRow.Item("TITLE") Dim oGuid As Integer = oRow.Item("GUID") - Dim oCronDetails As DataTable = Await GetCronJobDetails(oGuid) - If oCronDetails IsNot Nothing Then - _Logger.Debug("Loaded job [{0}]", oTitle) - _Logger.Debug("Job details: {0}", oCronDetails.Rows.Count) - _Logger.Debug("Job definition: {0}", oDefinition) + Dim oTrigger As ITrigger + Dim oJob As IJobDetail + Dim oIdentity As String = $"CRON-JOB-{oGuid}" - For Each oRowDetail As DataRow In oCronDetails.Rows - Dim oTrigger As ITrigger - Dim oJob As IJobDetail - Dim oDataTableName As String = oRowDetail.Item("DT_NAME") - Dim oRunOnStartup As Boolean = oRowDetail.Item("RUN_ON_STARTUP") - Dim oJobIdentity As String = $"{oGuid}~{oDataTableName}" + oTrigger = TriggerBuilder.Create(). + WithIdentity(oIdentity, JOB_GROUP). + WithCronSchedule(oDefinition). + Build() - Dim oBaseTrigger = TriggerBuilder.Create(). - WithIdentity(oJobIdentity, JOB_GROUP). - WithCronSchedule(oDefinition) + oJob = JobBuilder.Create(Of DatatableJob)(). + WithIdentity(oIdentity, JOB_GROUP). + UsingJobData(New JobDataMap From { + {"LogConfig", _LogConfig}, + {"MSSQL", _MSSQL}, + {"CronJobId", oGuid}, + {"CronJobTitle", oTitle} + }). + Build() - ' Run directly at startup if configured - If oRunOnStartup Then - oBaseTrigger = oBaseTrigger.StartNow() - End If - - oTrigger = oBaseTrigger.Build() - - oJob = JobBuilder.Create(Of DatatableJob)(). - WithIdentity(oJobIdentity, JOB_GROUP). - UsingJobData(New JobDataMap() From { - {"LogConfig", _LogConfig}, - {"MSSQL", _MSSQL}, - {"CronJobId", oGuid}, - {"CronJobTitle", oTitle}, - {"CronJobDetails", oRowDetail} - }). - Build() - - Await _Scheduler.ScheduleJob(oJob, oTrigger) - _Logger.Debug("Scheduled a new job for Cron Job Id [{0}]", oGuid) - Next - Else - _Logger.Warn("CronJob Details for CronJob [{0}] could not be fetched!", oGuid) - End If + Await _Scheduler.ScheduleJob(oJob, oTrigger) + _Logger.Debug("Scheduled a new job for Cron Job [{0}]", oTitle) Next Else _Logger.Warn("CronJobs could not be fetched!") diff --git a/Service.EDMIService/Scheduler/DatatableJob.vb b/Service.EDMIService/Scheduler/DatatableJob.vb index ebf7d330..e7303886 100644 --- a/Service.EDMIService/Scheduler/DatatableJob.vb +++ b/Service.EDMIService/Scheduler/DatatableJob.vb @@ -9,58 +9,127 @@ Imports Quartz Public Class DatatableJob Implements IJob + Private _MSSQL As MSSQLServer + Public Function Execute(context As IJobExecutionContext) As Task Implements IJob.Execute Dim oJobData = context.MergedJobDataMap Dim oLogConfig As LogConfig = oJobData.Item("LogConfig") + Dim oCronJobId As Integer = oJobData.Item("CronJobId") + Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") Dim oLogger As Logger = oLogConfig.GetLogger() - Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") - Dim oDatatableName As String = NotNull(oDetailRow.Item("DT_NAME"), String.Empty) + + Dim oResult As New JobResult() + + oLogger.Info("Running Datatable Job [{0}]", oCronJobTitle) Try - Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") + Dim oCronSQL As String = $"SELECT * FROM TBAPPSERV_CRON_DETAIL WHERE CRON_ID = {oCronJobId}" + Dim oCronDetails As DataTable = oMSSQL.GetDatatable(oCronSQL) - Dim oConnectionId As Integer = NotNull(oDetailRow.Item("CON_ID"), String.Empty) - Dim oTitle As String = NotNull(oDetailRow.Item("TITLE"), String.Empty) - Dim oSQL As String = NotNull(oDetailRow.Item("COMMAND"), String.Empty) + For Each oRow As DataRow In oCronDetails.Rows + Dim oConnectionId As Integer = NotNull(oRow.Item("CON_ID"), String.Empty) + Dim oTitle As String = NotNull(oRow.Item("TITLE"), String.Empty) + Dim oSQL As String = NotNull(oRow.Item("COMMAND"), String.Empty) + Dim oDatatableName As String = NotNull(oRow.Item("DT_NAME"), String.Empty) - oLogger.Debug("Running Command-Job [{0}]", oTitle) - oLogger.Debug("Datatable Name: {0}", oDatatableName) - oLogger.Debug("Connection Id: {0}", oConnectionId) + oLogger.Debug("Running Command-Job [{0}]", oTitle) + oLogger.Debug("Datatable Name: {0}", oDatatableName) + oLogger.Debug("Connection Id: {0}", oConnectionId) - Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) + Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) + Dim oTable = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) + oTable.TableName = oDatatableName + oLogger.Debug("Result Datatable [{0}] contains [{1}] rows", oTable.TableName, oTable.Rows.Count) - Dim oTable = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) - oTable.TableName = oDatatableName - oLogger.Debug("Result Datatable [{0}] contains [{1}] rows", oTable.TableName, oTable.Rows.Count) + Dim oResultTable = New JobResult.ResultTable() With { + .Table = oTable, + .DetailRow = oRow + } - Dim oResult = New JobResult() With { - .Table = oTable - } + Dim oChildTableNAme As String = NotNull(oRow.Item("CHILD_DT_NAME"), String.Empty) - Dim oChildTableNAme As String = NotNull(oDetailRow.Item("CHILD_DT_NAME"), String.Empty) + If oChildTableNAme <> String.Empty Then + Dim oParentColumn As String = NotNull(oRow.Item("DT_COLUMN"), String.Empty) + Dim oChildColumn As String = NotNull(oRow.Item("CHILD_DT_COLUMN"), String.Empty) + oLogger.Debug("Child Datatable [{0}] defined, Relation: Parent [{1}] -> Child [{2}]", oChildTableNAme, oParentColumn, oChildColumn) - If oChildTableNAme <> String.Empty Then - Dim oParentColumn As String = NotNull(oDetailRow.Item("DT_COLUMN"), String.Empty) - Dim oChildColumn As String = NotNull(oDetailRow.Item("CHILD_DT_COLUMN"), String.Empty) - oLogger.Debug("Child Datatable [{0}] defined, Relation: Parent [{1}] -> Child [{2}]", oChildTableName, oParentColumn, oChildColumn) + Dim oChildTable As DataTable = oMSSQL.GetDatatableWithConnection($"SELECT * FROM {oChildTableNAme}", oConnectionString) + oChildTable.TableName = oChildTableNAme + oLogger.Debug("Child Datatable [{0}] contains [{1}] rows", oChildTable.TableName, oChildTable.Rows.Count) - Dim oChildTable As DataTable = oMSSQL.GetDatatableWithConnection($"SELECT * FROM {oChildTableName}", oConnectionString) - oChildTable.TableName = oChildTableName - oLogger.Debug("Child Datatable [{0}] contains [{1}] rows", oChildTable.TableName, oChildTable.Rows.Count) + oResultTable.ChildTable = oChildTable + oResultTable.ChildRelationColumn = oChildColumn + oResultTable.TableRelationColumn = oParentColumn + End If - oResult.ChildTable = oChildTable - oResult.ChildRelationColumn = oChildColumn - oResult.TableRelationColumn = oParentColumn - End If + oLogger.Info("Fetched Datatable [{0}]", oDatatableName) + oResult.Tables.Add(oResultTable) + Next - ' Das Ergebnis speichern + ' Das Ergebnis speichern context.Result = oResult + Catch ex As Exception oLogger.Error(ex) - oLogger.Warn("Unhandled exception while executing SQL for Datatable {0}", oDatatableName) + oLogger.Warn("Unhandled exception while executing SQL for Datatable {0}", oCronJobTitle) End Try Return Task.FromResult(True) + +#Region "OLD" + 'Dim oJobData = context.MergedJobDataMap + 'Dim oLogConfig As LogConfig = oJobData.Item("LogConfig") + 'Dim oLogger As Logger = oLogConfig.GetLogger() + 'Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") + 'Dim oDatatableName As String = NotNull(oDetailRow.Item("DT_NAME"), String.Empty) + + 'Try + ' Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") + ' Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") + + ' Dim oConnectionId As Integer = NotNull(oDetailRow.Item("CON_ID"), String.Empty) + ' Dim oTitle As String = NotNull(oDetailRow.Item("TITLE"), String.Empty) + ' Dim oSQL As String = NotNull(oDetailRow.Item("COMMAND"), String.Empty) + + ' oLogger.Debug("Running Command-Job [{0}]", oTitle) + ' oLogger.Debug("Datatable Name: {0}", oDatatableName) + ' oLogger.Debug("Connection Id: {0}", oConnectionId) + + ' Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) + + ' Dim oTable = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) + ' oTable.TableName = oDatatableName + ' oLogger.Debug("Result Datatable [{0}] contains [{1}] rows", oTable.TableName, oTable.Rows.Count) + + ' Dim oResult = New JobResult() With { + ' .Table = oTable + ' } + + ' Dim oChildTableNAme As String = NotNull(oDetailRow.Item("CHILD_DT_NAME"), String.Empty) + + ' If oChildTableNAme <> String.Empty Then + ' Dim oParentColumn As String = NotNull(oDetailRow.Item("DT_COLUMN"), String.Empty) + ' Dim oChildColumn As String = NotNull(oDetailRow.Item("CHILD_DT_COLUMN"), String.Empty) + ' oLogger.Debug("Child Datatable [{0}] defined, Relation: Parent [{1}] -> Child [{2}]", oChildTableName, oParentColumn, oChildColumn) + + ' Dim oChildTable As DataTable = oMSSQL.GetDatatableWithConnection($"SELECT * FROM {oChildTableName}", oConnectionString) + ' oChildTable.TableName = oChildTableName + ' oLogger.Debug("Child Datatable [{0}] contains [{1}] rows", oChildTable.TableName, oChildTable.Rows.Count) + + ' oResult.ChildTable = oChildTable + ' oResult.ChildRelationColumn = oChildColumn + ' oResult.TableRelationColumn = oParentColumn + ' End If + + ' ' Das Ergebnis speichern + ' context.Result = oResult + 'Catch ex As Exception + ' oLogger.Error(ex) + ' oLogger.Warn("Unhandled exception while executing SQL for Datatable {0}", oDatatableName) + 'End Try + + 'Return Task.FromResult(True) +#End Region End Function End Class diff --git a/Service.EDMIService/Scheduler/JobListener.vb b/Service.EDMIService/Scheduler/JobListener.vb index d969cc47..50714c6b 100644 --- a/Service.EDMIService/Scheduler/JobListener.vb +++ b/Service.EDMIService/Scheduler/JobListener.vb @@ -26,6 +26,24 @@ Public Class JobListener Dataset = ResultDataSet End Sub + Public Overrides Function JobWasExecuted(context As IJobExecutionContext, jobException As JobExecutionException, Optional cancellationToken As CancellationToken = Nothing) As Task + _Logger.Info("Job [{0}] was executed successfully. Saving Data.", context.JobDetail.Key) + + Dim oResult As JobResult = context.Result + + For Each oTableResult As JobResult.ResultTable In oResult.Tables + Try + _Logger.Debug("Saving Datatable [{0}]", oTableResult.Table) + SaveDataTables(oTableResult) + + Catch ex As Exception + _Logger.Error("Error while executing SaveDataTables for {0}", oTableResult.Table.TableName) + End Try + Next + + Return MyBase.JobWasExecuted(context, jobException, cancellationToken) + End Function + Public Sub ReplaceExistingTable(Name As String, Table As DataTable, DataSet As DataSet, Optional ChildTable As DataTable = Nothing) Try Dim oDatatableNameTemp As String = Name & "-TEMP" @@ -140,16 +158,17 @@ Public Class JobListener End Try End Sub - Public Sub SaveDataTables(Result As JobResult, DetailRow As DataRow) + Public Sub SaveDataTables(Result As JobResult.ResultTable) Try Dim oTable As DataTable = Result.Table - Dim oName As String = DetailRow.Item("DT_NAME") - Dim oDetailId As Integer = DetailRow.Item("GUID") + Dim oName As String = Result.DetailRow.Item("DT_NAME") + Dim oDetailId As Integer = Result.DetailRow.Item("GUID") Dim oDatatableNameTemp As String = oName & "-TEMP" ' Used for debugging relations and constraints - 'ListTables(Dataset) + _Logger.Debug("Dataset BEFORE saving datatables") + ListTables(Dataset) If Dataset.Tables.Contains(oName) Then ' Replace existing table @@ -179,6 +198,10 @@ Public Class JobListener _Logger.Debug(oRelation.RelationName) Next + ' Used for debugging relations and constraints + _Logger.Debug("Dataset AFTER saving datatables") + ListTables(Dataset) + _MSSQL.ExecuteNonQuery($"INSERT INTO TBAPPSERV_CRON_DETAIL_HISTORY (DETAIL_ID) VALUES ({oDetailId})") Catch ex As Exception _Logger.Warn("Unexpected error in JobListener: {0}", ex.Message) @@ -205,11 +228,4 @@ Public Class JobListener oIndex += 1 Next End Sub - - Public Overrides Function JobWasExecuted(context As IJobExecutionContext, jobException As JobExecutionException, Optional cancellationToken As CancellationToken = Nothing) As Task - Dim oDetailRow As DataRow = context.MergedJobDataMap.Item("CronJobDetails") - SaveDataTables(context.Result, oDetailRow) - - Return MyBase.JobWasExecuted(context, jobException, cancellationToken) - End Function End Class diff --git a/Service.EDMIService/Scheduler/JobResult.vb b/Service.EDMIService/Scheduler/JobResult.vb index dfdfaf10..a9736f69 100644 --- a/Service.EDMIService/Scheduler/JobResult.vb +++ b/Service.EDMIService/Scheduler/JobResult.vb @@ -1,6 +1,12 @@ Public Class JobResult - Public Table As DataTable - Public ChildTable As DataTable - Public TableRelationColumn As String - Public ChildRelationColumn As String + Public Tables As New List(Of ResultTable) + + Public Class ResultTable + Public Table As DataTable + Public ChildTable As DataTable + Public TableRelationColumn As String + Public ChildRelationColumn As String + + Public DetailRow As DataRow + End Class End Class diff --git a/Service.JobRunner/App.config b/Service.JobRunner/App.config index fa6bbc22..fc4472ab 100644 --- a/Service.JobRunner/App.config +++ b/Service.JobRunner/App.config @@ -29,7 +29,7 @@ False - False|0 0 0/1 * * ?|RootPath::LDAP://DIGITALDATA,UserFilter::(&(samaccountname=@SAMACCOUNTNAME)),GroupFilter(&(samaccountname=*)) + False|0 0 0/1 * * ?|RootPath::LDAP://DIGITALDATA,UserFilter::(&(samaccountname=@SAMACCOUNTNAME)),GroupFilter::(&(samaccountname=*)) True|10/0 * * * * ?|Foo::Bar