121 lines
5.3 KiB
C#
121 lines
5.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Web.Caching;
|
|
using Disco.Data.Repository;
|
|
using Quartz;
|
|
using Quartz.Impl.Triggers;
|
|
|
|
namespace Disco.BI.DocumentTemplateBI.Importer
|
|
{
|
|
[PersistJobDataAfterExecution]
|
|
public class DocumentImporterJob : IJob
|
|
{
|
|
|
|
void IJob.Execute(IJobExecutionContext context)
|
|
{
|
|
string sessionId = context.JobDetail.JobDataMap["SessionId"] as string;
|
|
if (string.IsNullOrEmpty(sessionId))
|
|
{
|
|
sessionId = Guid.NewGuid().ToString();
|
|
context.JobDetail.JobDataMap["SessionId"] = sessionId;
|
|
}
|
|
|
|
string filename = context.JobDetail.JobDataMap["Filename"] as string;
|
|
int retryCount = (int)context.JobDetail.JobDataMap["RetryCount"];
|
|
Cache httpCache = context.JobDetail.JobDataMap["HttpCache"] as Cache;
|
|
|
|
var friendlyFilename = filename;
|
|
if (!string.IsNullOrEmpty(friendlyFilename))
|
|
friendlyFilename = System.IO.Path.GetFileName(friendlyFilename);
|
|
|
|
DocumentImporterLog.LogImportStarting(sessionId, friendlyFilename);
|
|
|
|
if (!File.Exists(filename))
|
|
{
|
|
DocumentImporterLog.LogImportWarning(sessionId, string.Format("File not found: {0}", filename));
|
|
DocumentImporterLog.LogImportFinished(sessionId);
|
|
context.Scheduler.DeleteJob(context.JobDetail.Key);
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
|
{
|
|
if (retryCount < 18)
|
|
{
|
|
context.JobDetail.JobDataMap["RetryCount"] = (++retryCount);
|
|
bool processResult = Interop.Pdf.PdfImporter.ProcessPdfAttachment(filename, dbContext, sessionId, httpCache);
|
|
|
|
if (processResult)
|
|
{
|
|
// Import Successful - Delete
|
|
if (File.Exists(filename))
|
|
File.Delete(filename);
|
|
}
|
|
else
|
|
{
|
|
// Import Failed - Move to Errors Folder
|
|
if (File.Exists(filename))
|
|
{
|
|
try
|
|
{
|
|
string folderError = DataStore.CreateLocation(dbContext, "DocumentDropBox_Errors");
|
|
string filenameError = Path.Combine(folderError, Path.GetFileName(filename));
|
|
int filenameErrorCount = 0;
|
|
while (File.Exists(filenameError))
|
|
{
|
|
filenameError = Path.Combine(folderError, string.Format("{0} ({1}){2}", Path.GetFileNameWithoutExtension(filename), ++filenameErrorCount, Path.GetExtension(filename)));
|
|
}
|
|
File.Move(filename, filenameError);
|
|
}
|
|
catch
|
|
{
|
|
// Ignore Errors
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// To Many Errors
|
|
DocumentImporterLog.LogImportError(sessionId, string.Format("To many errors occurred trying to import '{1}' (SessionId: {0})", sessionId, friendlyFilename));
|
|
// Move to Errors Folder
|
|
if (File.Exists(filename))
|
|
{
|
|
try
|
|
{
|
|
string folderError = DataStore.CreateLocation(dbContext, "DocumentDropBox_Errors");
|
|
string filenameError = Path.Combine(folderError, Path.GetFileName(filename));
|
|
int filenameErrorCount = 0;
|
|
while (File.Exists(filenameError))
|
|
{
|
|
filenameError = Path.Combine(folderError, string.Format("{0} ({1}){2}", Path.GetFileNameWithoutExtension(filename), ++filenameErrorCount, Path.GetExtension(filename)));
|
|
}
|
|
File.Move(filename, filenameError);
|
|
}
|
|
catch
|
|
{
|
|
// Ignore Errors
|
|
}
|
|
}
|
|
}
|
|
}
|
|
DocumentImporterLog.LogImportFinished(sessionId);
|
|
|
|
// All Done
|
|
context.Scheduler.DeleteJob(context.JobDetail.Key);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
DocumentImporterLog.LogImportWarning(sessionId, string.Format("{0}; Will try again in 10 Seconds", ex.Message));
|
|
// Reschedule Job for 10 seconds
|
|
SimpleTriggerImpl trig = new SimpleTriggerImpl(Guid.NewGuid().ToString(), new DateTimeOffset(DateTime.Now.AddSeconds(10)));
|
|
context.Scheduler.RescheduleJob(context.Trigger.Key, trig);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|