Ejemplo n.º 1
0
        private void TryEnqueueJobs(PipelineMessage pMessage)
        {
            string sessionId = pMessage.Id;
            string appId     = pMessage.Targets[WidgetConst.PMSGIDX_APPID];

            string[] scopes = pMessage.Targets[WidgetConst.PMSGIDX_SCOPES].Split(';');

            void EnqueueJob(dynamic profile)
            {
                string profileJson    = ((object)(profile.User)).ToJson();
                string profileName    = profile.System.ProfileName;
                string procedure      = profile.System.Procedure;
                string cronExpression = profile.System.CronExpression;
                int    maxAge         = profile.System.MaxAge;

                BackgroundJob.Enqueue <TrackerBuilder>(t => t.AddSessionState(
                                                           sessionId, nameof(SessionStates.Pending)));

                string syncJob = $"{appId}.{profileName}";

                if (!SchedulerJobs.Contains(syncJob))
                {
                    var scheduler = new Scheduler {
                        CronExpression = cronExpression
                    };
                    scheduler.OnTime += (s, e) => {
                        BackgroundJob.Enqueue <TrackerBuilder>(t => t.SyncSessionStates(procedure, profileJson));
                    };
                    SchedulerJobs.Add(syncJob);
                    Task.Run(() => { scheduler.Start(); scheduler.Dispose(); });
                    Task.Run(() => { SpinWait.SpinUntil(() => false, maxAge); scheduler.Abort(); SchedulerJobs.Remove(syncJob); });
                }
            }

            try {
                var profiles = Profile.LoadProfile(appId, Const.PLUGIN_NAME, scopes);
                Parallel.ForEach(profiles, profile => {
                    EnqueueJob(profile);
                });
            }
            catch (AggregateException e) {
                foreach (var ie in e.InnerExceptions)
                {
                    Logger.LogError(ie, ie.ToString());
                }
            }
            catch (Exception e) {
                Logger.LogError(e, e.ToString());
            }
        }