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());
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 5
0
        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());
 }
Ejemplo n.º 7
0
 public Task Execute(IJobExecutionContext context)
 {
     Console.WriteLine("Inside Job");
     return(context.AsTaskResult());
 }
 public Task Execute(IJobExecutionContext context)
 {
     // ... job code goes here
     return(context.AsTaskResult());
 }
Ejemplo n.º 9
0
        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());
        }