Refactor envelope processing for per-item error handling
Move per-envelope logic in FinalizeDocumentJob into its own try-catch block within the foreach loop. This ensures that exceptions in processing one envelope do not halt the processing of others, improving robustness and fault tolerance. Removed the outer try-catch-finally block and updated logging to reflect per-envelope and overall job status.
This commit is contained in:
@@ -43,127 +43,105 @@ public class FinalizeDocumentJob(IOptions<WorkerOptions> options, IConfiguration
|
|||||||
var jobId = typeof(FinalizeDocumentJob).FullName;
|
var jobId = typeof(FinalizeDocumentJob).FullName;
|
||||||
logger.LogDebug("Starting job {jobId}", jobId);
|
logger.LogDebug("Starting job {jobId}", jobId);
|
||||||
|
|
||||||
try
|
_config = await mediator.Send(new ReadDefaultConfigQuery(), cancel);
|
||||||
|
|
||||||
|
var envelopes = await envRepo
|
||||||
|
.Where(e => e.Status == EnvelopeStatus.EnvelopeCompletelySigned
|
||||||
|
&& e.ChangedWhen.HasValue
|
||||||
|
&& EF.Functions.DateDiffMinute(e.ChangedWhen.Value, DateTime.Now) >= CompleteWaitTime)
|
||||||
|
.OrderBy(e => e.Id)
|
||||||
|
.ToListAsync(cancel);
|
||||||
|
|
||||||
|
if (envelopes.Count > 0)
|
||||||
|
logger.LogInformation("Found [{count}] completed envelopes.", envelopes.Count);
|
||||||
|
|
||||||
|
var total = envelopes.Count;
|
||||||
|
var current = 1;
|
||||||
|
|
||||||
|
foreach (var envelope in envelopes)
|
||||||
{
|
{
|
||||||
_config = await mediator.Send(new ReadDefaultConfigQuery(), cancel);
|
try
|
||||||
|
|
||||||
var envelopes = await envRepo
|
|
||||||
.Where(e => e.Status == EnvelopeStatus.EnvelopeCompletelySigned
|
|
||||||
&& e.ChangedWhen.HasValue
|
|
||||||
&& EF.Functions.DateDiffMinute(e.ChangedWhen.Value, DateTime.Now) >= CompleteWaitTime)
|
|
||||||
.OrderBy(e => e.Id)
|
|
||||||
.ToListAsync(cancel);
|
|
||||||
|
|
||||||
if (envelopes.Count > 0)
|
|
||||||
logger.LogInformation("Found [{count}] completed envelopes.", envelopes.Count);
|
|
||||||
|
|
||||||
var total = envelopes.Count;
|
|
||||||
var current = 1;
|
|
||||||
|
|
||||||
foreach (var envelope in envelopes)
|
|
||||||
{
|
{
|
||||||
|
var envelopeData = GetEnvelopeData(envelope.Id);
|
||||||
|
|
||||||
|
if (envelopeData is null)
|
||||||
|
{
|
||||||
|
logger.LogWarning("EnvelopeData could not be loaded for Id [{id}]!", envelope.Id);
|
||||||
|
throw new ArgumentNullException(nameof(EnvelopeData));
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogDebug("Burning Annotations to pdf ...");
|
||||||
|
var burnedDocument = BurnAnnotationsToPdf(envelopeData);
|
||||||
|
if (burnedDocument is null)
|
||||||
|
{
|
||||||
|
logger.LogWarning("Document could not be finalized!");
|
||||||
|
throw new ApplicationException("Document could not be finalized");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actionService?.CreateReport(envelope) == false)
|
||||||
|
{
|
||||||
|
logger.LogWarning("Document Report could not be created!");
|
||||||
|
throw new ApplicationException("Document Report could not be created");
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogDebug("Creating report..");
|
||||||
|
var report = reportCreator!.CreateReport(envelope);
|
||||||
|
logger.LogDebug("Report created!");
|
||||||
|
|
||||||
|
logger.LogDebug("Merging documents ...");
|
||||||
|
var mergedDocument = pdfMerger!.MergeDocuments(burnedDocument, report);
|
||||||
|
logger.LogDebug("Documents merged!");
|
||||||
|
|
||||||
|
var outputDirectoryPath = Path.Combine(_config.ExportPath, _parentFolderUid);
|
||||||
|
logger.LogDebug("oOutputDirectoryPath is {outputDirectoryPath}", outputDirectoryPath);
|
||||||
|
if (!Directory.Exists(outputDirectoryPath))
|
||||||
|
{
|
||||||
|
logger.LogDebug("Directory not existing. Creating ... ");
|
||||||
|
Directory.CreateDirectory(outputDirectoryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
var outputFilePath = Path.Combine(outputDirectoryPath, $"{envelope.Uuid}.pdf");
|
||||||
|
logger.LogDebug("Writing finalized Pdf to disk..");
|
||||||
|
logger.LogInformation("Output path is [{outputFilePath}]", outputFilePath);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var envelopeData = GetEnvelopeData(envelope.Id);
|
File.WriteAllBytes(outputFilePath, mergedDocument);
|
||||||
|
|
||||||
if (envelopeData is null)
|
|
||||||
{
|
|
||||||
logger.LogWarning("EnvelopeData could not be loaded for Id [{id}]!", envelope.Id);
|
|
||||||
throw new ArgumentNullException(nameof(EnvelopeData));
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogDebug("Burning Annotations to pdf ...");
|
|
||||||
var burnedDocument = BurnAnnotationsToPdf(envelopeData);
|
|
||||||
if (burnedDocument is null)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Document could not be finalized!");
|
|
||||||
throw new ApplicationException("Document could not be finalized");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actionService?.CreateReport(envelope) == false)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Document Report could not be created!");
|
|
||||||
throw new ApplicationException("Document Report could not be created");
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogDebug("Creating report..");
|
|
||||||
var report = reportCreator!.CreateReport(envelope);
|
|
||||||
logger.LogDebug("Report created!");
|
|
||||||
|
|
||||||
logger.LogDebug("Merging documents ...");
|
|
||||||
var mergedDocument = pdfMerger!.MergeDocuments(burnedDocument, report);
|
|
||||||
logger.LogDebug("Documents merged!");
|
|
||||||
|
|
||||||
var outputDirectoryPath = Path.Combine(_config.ExportPath, _parentFolderUid);
|
|
||||||
logger.LogDebug("oOutputDirectoryPath is {outputDirectoryPath}", outputDirectoryPath);
|
|
||||||
if (!Directory.Exists(outputDirectoryPath))
|
|
||||||
{
|
|
||||||
logger.LogDebug("Directory not existing. Creating ... ");
|
|
||||||
Directory.CreateDirectory(outputDirectoryPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputFilePath = Path.Combine(outputDirectoryPath, $"{envelope.Uuid}.pdf");
|
|
||||||
logger.LogDebug("Writing finalized Pdf to disk..");
|
|
||||||
logger.LogInformation("Output path is [{outputFilePath}]", outputFilePath);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
File.WriteAllBytes(outputFilePath, mergedDocument);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Could not export final document to disk!");
|
|
||||||
throw new ExportDocumentException("Could not export final document to disk!", ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogDebug("Writing EB-bytes to database...");
|
|
||||||
UpdateFileDb(outputFilePath, envelope.Id);
|
|
||||||
|
|
||||||
if (!SendFinalEmails(envelope))
|
|
||||||
{
|
|
||||||
throw new ApplicationException("Final emails could not be sent!");
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogInformation("Report-mails successfully sent!");
|
|
||||||
|
|
||||||
logger.LogDebug("Setting envelope status..");
|
|
||||||
if (actionService?.FinalizeEnvelope(envelope) == false)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Envelope could not be finalized!");
|
|
||||||
throw new ApplicationException("Envelope could not be finalized");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
logger.LogError(ex);
|
logger.LogWarning("Could not export final document to disk!");
|
||||||
logger.LogWarning(ex, "Unhandled exception while working envelope [{id}]", envelope.Id);
|
throw new ExportDocumentException("Could not export final document to disk!", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
current += 1;
|
logger.LogDebug("Writing EB-bytes to database...");
|
||||||
logger.LogInformation("Envelope [{id}] finalized!", envelope.Id);
|
UpdateFileDb(outputFilePath, envelope.Id);
|
||||||
|
|
||||||
|
if (!SendFinalEmails(envelope))
|
||||||
|
{
|
||||||
|
throw new ApplicationException("Final emails could not be sent!");
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogInformation("Report-mails successfully sent!");
|
||||||
|
|
||||||
|
logger.LogDebug("Setting envelope status..");
|
||||||
|
if (actionService?.FinalizeEnvelope(envelope) == false)
|
||||||
|
{
|
||||||
|
logger.LogWarning("Envelope could not be finalized!");
|
||||||
|
throw new ApplicationException("Envelope could not be finalized");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
logger.LogError(ex);
|
||||||
|
logger.LogWarning(ex, "Unhandled exception while working envelope [{id}]", envelope.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.LogDebug("Completed job {jobId} successfully!", jobId);
|
current += 1;
|
||||||
}
|
logger.LogInformation("Envelope [{id}] finalized!", envelope.Id);
|
||||||
catch (MergeDocumentException ex)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Certificate Document job failed at step: Merging documents!");
|
|
||||||
logger.LogError(ex);
|
|
||||||
}
|
|
||||||
catch (ExportDocumentException ex)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Certificate Document job failed at step: Exporting document!");
|
|
||||||
logger.LogError(ex);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Certificate Document job failed!");
|
|
||||||
logger.LogError(ex);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
logger.LogDebug("Job execution for [{jobId}] ended", jobId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.LogDebug("Completed job {jobId} successfully!", jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateFileDb(string filePath, long envelopeId)
|
private void UpdateFileDb(string filePath, long envelopeId)
|
||||||
|
|||||||
Reference in New Issue
Block a user