Jonathan Jenne 1e925242bc 20-12-2022
2022-12-20 15:29:29 +01:00

121 lines
4.1 KiB
VB.net

Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging
Imports ECM.JobRunner.Common
Public Class JobStatus
Inherits BaseClass
Public ReadOnly Entries As New List(Of StatusItem)
Public Sub New(pLogConfig As LogConfig)
MyBase.New(pLogConfig)
End Sub
Public Sub Start(pJob As Quartz.IJobExecutionContext)
Dim oStatus = GetJobStatus(pJob)
Logger.Info("Starting Job [{0}]", oStatus.Id)
If oStatus IsNot Nothing Then
oStatus.Name = pJob.JobDetail.Key.Name
oStatus.StartTime = Date.Now
oStatus.UpdateTime = Date.Now
oStatus.Executing = True
End If
End Sub
Public Sub Update(pJob As Quartz.IJobExecutionContext, pCurrent As Integer, pTotal As Integer)
Dim oStatus = GetJobStatus(pJob)
Logger.Debug("Updating Job [{0}] with Status [{1}/{2}]", oStatus.Id, pCurrent, pTotal)
If oStatus IsNot Nothing Then
oStatus.ProgressTotal = pTotal
oStatus.ProgressCurrent = pCurrent
oStatus.ExecutionTime = pJob.JobRunTime
oStatus.UpdateTime = Date.Now
End If
End Sub
Public Function CompleteWithError(pJob As Quartz.IJobExecutionContext, pSteps As List(Of StatusItem.HistoryStep), pException As Exception) As StatusItem
Return CompleteWithError(pJob, pSteps, pException.Message)
End Function
Public Function CompleteWithError(pJob As Quartz.IJobExecutionContext, pSteps As List(Of StatusItem.HistoryStep), pMessage As String) As StatusItem
Dim oStatus = GetJobStatus(pJob)
Logger.Info("Completing Job [{0}] with Error", oStatus.Id)
If oStatus IsNot Nothing Then
oStatus.FailureMessage = pMessage
oStatus.Successful = False
oStatus.Waiting = False
End If
Return DoComplete(pJob, pSteps)
End Function
Public Function CompleteWithWaiting(pJob As Quartz.IJobExecutionContext, pSteps As List(Of StatusItem.HistoryStep), pMessage As String) As StatusItem
Dim oStatus = GetJobStatus(pJob)
Logger.Info("Completing Job [{0}] with Waiting", oStatus.Id)
If oStatus IsNot Nothing Then
oStatus.SuccessMessage = pMessage
oStatus.Successful = True
oStatus.Waiting = True
End If
Return DoComplete(pJob, pSteps)
End Function
Public Function CompleteWithSuccess(pJob As Quartz.IJobExecutionContext, pSteps As List(Of StatusItem.HistoryStep), pMessage As String) As StatusItem
Dim oStatus = GetJobStatus(pJob)
Logger.Info("Completing Job [{0}] with Success", oStatus.Id)
If oStatus IsNot Nothing Then
oStatus.SuccessMessage = pMessage
oStatus.Successful = True
oStatus.Waiting = False
End If
Return DoComplete(pJob, pSteps)
End Function
Private Function DoComplete(pJob As Quartz.IJobExecutionContext, pSteps As List(Of StatusItem.HistoryStep))
Dim oStatus = GetJobStatus(pJob)
oStatus.ProgressCurrent = oStatus.ProgressTotal
oStatus.ExecutionTime = pJob.JobRunTime
oStatus.Executing = False
oStatus.CompleteTime = Date.Now
oStatus.Steps = pSteps
Return oStatus
End Function
Private Function GetJobStatus(pJob As Quartz.IJobExecutionContext) As StatusItem
Dim oJobId As String = GetJobId(pJob)
Logger.Debug("Getting status for job id [{0}]", oJobId)
Dim oExists = Entries.Where(Function(e) e.JobId = oJobId).Any()
Logger.Debug("Job exists: [{0}]", oExists)
If Not oExists Then
Logger.Debug("Creating status for job id [{0}]", oJobId)
Entries.Add(New StatusItem With {
.JobId = oJobId,
.Id = Guid.NewGuid.ToString(),
.Steps = New List(Of StatusItem.HistoryStep)
})
End If
Return Entries.Where(Function(e) e.JobId = oJobId).Single()
End Function
Private Function GetJobId(pJob As Quartz.IJobExecutionContext) As String
Return pJob.JobDetail.Key.ToString() & pJob.FireTimeUtc.ToString("u")
End Function
End Class