using LiteCharms.Features.Abstractions; using LiteCharms.Features.Mediator; namespace LiteCharms.Features.Quartz; [DisallowConcurrentExecution] public sealed class MediatorJob(IMediator mediator) : IJob where TNotification : IEvent { public async Task Execute(IJobExecutionContext context) { if (context.Recovering) Trace.WriteLine($"CRITICAL RECOVERY: Resurrecting job '{typeof(TNotification).Name}' after a previous cluster node crashed mid-execution."); var data = context.MergedJobDataMap["Payload"] as string; if (string.IsNullOrWhiteSpace(data)) { Trace.WriteLine("Job Payload missing, job ended"); return; } var notification = JsonSerializer.Deserialize(data); if (notification is null) { Trace.WriteLine("Notification could not be Json converted from data string, job ended"); return; } using var activity = MediatorTelemetry.Source.StartActivity(typeof(TNotification).Name); activity?.SetTag("event.correlation_id", notification.CorrelationId); try { await mediator.Publish(notification, context.CancellationToken); Trace.WriteLine("Job published successfully"); } catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) { Trace.WriteLine($"Job '{typeof(TNotification).Name}' was gracefully interrupted by the cluster control plane."); activity?.SetStatus(ActivityStatusCode.Ok); return; } } }