public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = new CancellationToken()) { History.PushFront(new JobExecutionHistory { Id = context.FireInstanceId, JobKey = context.JobDetail.Key.Map(), RunTime = context.JobRunTime, Data = context.MergedJobDataMap.Map(), Status = JobExecutionStatus.Vetoed }); return(context.AsTaskResult()); }
public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = new CancellationToken()) { // Retrieve history id from context and update history record. History.PushFront(new JobExecutionHistory { Id = context.FireInstanceId, JobKey = context.JobDetail.Key.Map(), RunTime = context.JobRunTime, Data = context.MergedJobDataMap.Map(), Exception = jobException.UnwrapIfSingleException(), Status = jobException == null ? JobExecutionStatus.Success : JobExecutionStatus.Failed }); return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { string fileName = "DBAdv.mdb"; string sourcePath = @"C:\Users\Yousef.Ataya\Desktop\shared"; string targetPath = @"C:\Users\Yousef.Ataya\Desktop\shared\backups-db"; // Use Path class to manipulate file and directory paths. string sourceFile = System.IO.Path.Combine(sourcePath, fileName); string destFile = System.IO.Path.Combine(targetPath, fileName); // To copy a folder's contents to a new location: // Create a new target folder. // If the directory already exists, this method does not create a new directory. System.IO.Directory.CreateDirectory(targetPath); // To copy a file to another location and // overwrite the destination file if it already exists. System.IO.File.Copy(sourceFile, destFile, true); // To copy all the files in one directory to another directory. // Get the files in the source folder. (To recursively iterate through // all subfolders under the current directory, see // "How to: Iterate Through a Directory Tree.") // Note: Check for target path was performed previously // in this code example. if (System.IO.Directory.Exists(sourcePath)) { string[] files = System.IO.Directory.GetFiles(sourcePath); // Copy the files and overwrite destination files if they already exist. foreach (string s in files) { // Use static Path methods to extract only the file name from the path. fileName = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(targetPath, DateTime.Now + fileName); System.IO.File.Copy(s, destFile, true); } } else { Console.WriteLine("Source path does not exist!"); } return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { Thread.Sleep(TimeSpan.FromMinutes(1)); // get job data var contextMergedJobData = context.MergedJobDataMap["Name"]?.ToString(); // do some work, call a service var response = Services.Any(new Hello { Name = contextMergedJobData ?? "there!" }); context.Result = response.Result; return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { var settings = (TriggerActionSettings)ConfigurationManager.GetSection("TriggerActionSettings"); var envSettings = settings.Environments.First(x => x.Name == settings.DefaultEnvironment); _baseUri = envSettings.WebServiceURL; var username = ""; var password = ""; var outgoingFolder = AppSettings.GetRequiredString("scps.outgoingFolder"); var path = FileSystemHelper.IsFullPath(outgoingFolder) ? outgoingFolder : Path.Combine(Constants.ApplicationDataFolder, outgoingFolder); // Crea tutte le directory e le sottodirectory nel percorso specificato a meno che non esistano già. var directoryInfo = Directory.CreateDirectory(path); var files = Directory.GetFiles(directoryInfo.FullName, "*.json", SearchOption.TopDirectoryOnly); var ResourceIds = new List <string> { }; // Considereremo al massimo un file per ciascun "resource_id". foreach (var fileInfo in files.Select(fileName => new FileInfo(fileName))) { try { var processedFilesDirectory = fileInfo.Directory.CreateSubdirectory("processed"); if (fileInfo.IsFileLocked()) { continue; } // Indirizziamo il file in base alla "collaboration" com'è definita nella relativa tabella. string jsonToPush = default; PushRequest pr = null; try { jsonToPush = fileInfo.ReadAllText(); pr = jsonToPush.FromJson <PushRequest>(); var qr = HostContext.ServiceController.Execute(new QueryCollaboration { ResourceId = pr.ResourceId }) as QueryResponse <Collaboration>; username = qr.Results.First().Username; password = envSettings.Accounts.First(x => x.Username == username).Password; } catch (Exception ex) { Log.Error(ex.Message, ex); fileInfo.MoveTo(Path.ChangeExtension(fileInfo.FullName, "error")); continue; // foreach } if (ResourceIds.Contains(pr.ResourceId)) { continue; // Consideriamo al massimo un file per ciascun "resource_id". } ResourceIds.Add(pr.ResourceId); /* * Prima di tentare il "push" consideriamo la possibilità che l'ultimo dataset inviato con * succcesso al server (codice "02") differisca da quello corrente solo per la marca temporale. In * questo caso tutto il "verticale" è probabilmente fermo ed omettiamo perciò l'invio del dataset, * così che la situazione si rispecchi negli "Interoperability Indicators" della SCP-GUI. * * Fidandoci della marca temporale presente nel nome del file, supponiamo che il dataset più * recente sia l'ultimo in ordine alfabetico. */ string lastSuccessfulFile; var pushSuccesfulFolderPath = Path.Combine(fileInfo.Directory.FullName, "processed", "02"); try { lastSuccessfulFile = Directory.GetFiles(pushSuccesfulFolderPath, $"*_{pr.ResourceId}*.json", SearchOption.TopDirectoryOnly) .OrderBy(f => f).LastOrDefault(); } catch (Exception ex) { Log.Error(ex.Message, ex); lastSuccessfulFile = default; } if (!string.IsNullOrEmpty(lastSuccessfulFile)) { try { var history = File.ReadAllText(lastSuccessfulFile).FromJson <PushRequest>(); history.Dataset.UrbanDataset.Context.Timestamp = pr.Dataset.UrbanDataset.Context.Timestamp; history.Dataset.UrbanDataset.Context.TimeZone = pr.Dataset.UrbanDataset.Context.TimeZone; if (JsonSerializer.SerializeToString(history) == jsonToPush) { Log.InfoFormat("{0} data already sent, skipping.", pr.ResourceId); File.Move(fileInfo.FullName, Path.Combine(fileInfo.Directory.CreateSubdirectory("skipped").FullName, fileInfo.Name)); continue; // foreach } } catch (Exception ex) { Log.Error(ex.Message, ex); } } /* * Se il file non è stato saltato procediamo con il tentativo di invio alla SCP. */ if (Client.BearerToken.IsNullOrEmpty()) { try { var loginResponse = Client.Post(new LoginRequest { Username = username, Password = password }); if (loginResponse.Code == "01" && loginResponse.Message == "Authentication Successful" && !loginResponse.Token.IsNullOrWhiteSpace()) { Client.BearerToken = loginResponse.Token; } } catch (Exception ex) { Log.Error(ex.Message, ex); } } else { try { var isAliveResponse = Client.PostBody(new IsAliveRequest { }, ""); if (isAliveResponse.Code != "00" || isAliveResponse.Message != "Successful" || isAliveResponse.Username != username) { Client.BearerToken = ""; var loginResponse = Client.Post(new LoginRequest { Username = username, Password = password }); if (loginResponse.Code == "01" && loginResponse.Message == "Authentication Successful" && !loginResponse.Token.IsNullOrWhiteSpace()) { Client.BearerToken = loginResponse.Token; } } } catch (Exception ex) { Log.Error(ex.Message, ex); } } if (!Client.BearerToken.IsNullOrEmpty()) { // NOTA: Tecnicamente non sarebbe necessario limitare il numero di esecuzioni del ciclo "do", // preferisco tuttavia evitare ogni possibilità di un loop senza uscita causato da eventuali // comportamenti "anomali" del server che al momento potrei non essere in grado di prevedere. int maxRetries = 2; string code; do { var pushResp = Client.Post <PushResponse>("/push", jsonToPush); // In data 9 luglio 2021 gli UrbanDataset esistenti *non* vengono aggiornati, perciò se il // server ha risposto "UrbanDataset already exists" lo cancelliamo dalla SCP. Se l'operazione // ha successo *non* spostiamo il file tra quelli elaborati, ritenteremo poi l'invio. if (pushResp.Detail == "UrbanDataset already exists") { var deleteResp = Client.Post(new DeleteRequest { ResourceId = pr.ResourceId, Timestamp = pr.Dataset.UrbanDataset.Context.Timestamp }); code = deleteResp.Code; } else { code = pushResp.Code; } if (code != "08") // "08" => "Delete Successful" { var moveTo = fileInfo.Directory.CreateSubdirectory(Path.Combine("processed", pushResp.Code)); File.Move(fileInfo.FullName, Path.Combine(moveTo.FullName, fileInfo.Name)); } } while (code == "08" && --maxRetries > 0); } } catch (Exception ex) { Log.Error(ex); } } return(context.AsTaskResult()); }
public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = new CancellationToken()) { // Insert history record and retrieve primary key of inserted record. context.Put("HistoryIdKey", context.FireInstanceId); return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { Console.WriteLine("Inside Job"); return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { // ... job code goes here return(context.AsTaskResult()); }
public Task Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; List <string> batchOperationTypes; try { batchOperationTypes = dataMap.GetString("BatchOperationTypeIn")?.FromJsv <List <string> >() .Select(x => x.Trim()).Distinct().ToList(); } catch (Exception ex) { Log.Error(ex.Message, ex); batchOperationTypes = new List <string> { }; } foreach (var batchOperationType in batchOperationTypes) { var match = Regex.Match(batchOperationType, UrbanDatasetGatewayService.ResourceIdPattern); if (!match.Success) { continue; } /* * N.B. Come marca temporale per la generazione del dataset * utilizzeremo l'istante di esecuzione pianificato per il job. */ object requestDto = new BasicRequest { ResourceId = batchOperationType, TimestampLessThan = context.ScheduledFireTimeUtc?.LocalDateTime }; object v = HostContext.ServiceController.Execute(requestDto); if (v is BasicResponse resp && resp.Code == "03") // Request-Response Successful { var outgoingFolder = AppSettings.GetRequiredString("scps.outgoingFolder"); var path1 = FileSystemHelper.IsFullPath(outgoingFolder) ? outgoingFolder : Path.Combine(Constants.ApplicationDataFolder, outgoingFolder); var resource_id = match.Groups["ResourceId"].Value; foreach (var item in resp.Dataset) { var pushRequest = new PushRequest { ResourceId = resource_id, Dataset = item }; /* * Costruiamo il nome del file premettendo al "resource_id" una marca temporale in formato * ISO 8601 sulla falsariga della SCP-GUI. Dobbiamo tuttavia aggiungere un ulteriore marcatore * poiché non è a priori escluso che più "flussi" contemporanei possano convergere verso la * stessa risorsa. */ var prefix = item.UrbanDataset.Context.Timestamp.ToString("yyyyMMddTHHmmss"); var ticks = DateTime.Now.Ticks; var path = Path.Combine(path1, $"{prefix}_{batchOperationType}_{ticks:D20}.json"); using (var stream = File.OpenWrite(path)) { JsonSerializer.SerializeToStream(pushRequest, stream); } } } } return(context.AsTaskResult()); }