/// <summary>
 /// Adds a trigger that executes once at specified state change.
 /// </summary>
 /// <param name="changeType">Type of the change.</param>
 /// <returns>
 ///   <see cref="TriggerBuilder" /> instance.
 /// </returns>
 public TriggerBuilder OnStateChange(TaskSessionStateChangeType changeType)
 {
     var b = new TriggerBuilder(tb, TaskTriggerType.SessionStateChange);
     ((SessionStateChangeTrigger)b.trigger).StateChange = changeType;
     return b;
 }
예제 #2
0
        static void Main(string[] args)
        {
            RESTApi.ServerUrl = "http://*****:*****@gmail.com");
                                //msg.To.Add(tmp.user.Email);
                                msg.To.Add("*****@*****.**");
                                msg.Subject                  = "Status your work " + DateTime.Now.ToString();
                                msg.Body                     = tmp.user.FullName + ", " + tmp.problem.Subject + " " + tmp.state.Status;
                                SmtpClient client            = new SmtpClient();
                                client.UseDefaultCredentials = true;
                                client.Host                  = "smtp.gmail.com";
                                client.Port                  = 587;
                                client.EnableSsl             = true;
                                client.DeliveryMethod        = SmtpDeliveryMethod.Network;
                                client.Credentials           = new NetworkCredential("*****@*****.**", "Qwerty`123");
                                client.Timeout               = 20000;
                                try
                                {
                                    client.Send(msg);
                                    Console.WriteLine("Mail has been successfully sent!");
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("Fail Has error" + ex.Message);
                                }
                                finally
                                {
                                    msg.Dispose();
                                }

                                tempStudentFiles[tmp.problem.TeacherId].Add(tmp);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.Message);
                            }
                        };
                        channel.BasicConsume("QStudentFiles", true, consumer);

                        Console.WriteLine(" Press [enter] to exit.");
                        Console.ReadLine();
                    }
            }
                                       );

            worker.Start();

            ISchedulerFactory schedFact = new StdSchedulerFactory();

            // get a scheduler
            IScheduler sched = schedFact.GetScheduler().Result;

            sched.Start();


            IJobDetail job = JobBuilder.Create <HelloJob>()
                             .WithIdentity("myJob", "group1")
                             .Build();


            ITrigger trigger = TriggerBuilder.Create()
                               .WithIdentity("myTrigger", "group1")
                               .StartNow()
                               .WithSimpleSchedule(x => x
                                                   .WithIntervalInMinutes(1)
                                                   .RepeatForever())
                               .Build();

            sched.ScheduleJob(job, trigger);
        }
예제 #3
0
        public override void OnLoggedOn(SteamUser.LoggedOnCallback callback)
        {
            switch (callback.Result)
            {
            case EResult.OK:
                _log.Debug("Successfully logged in. Checking for any VAC or game bans...");

                var banInfo = Titan.Instance.BanManager.GetBanInfoFor(_steamUser.SteamID.ConvertToUInt64());
                if (banInfo != null && (banInfo.VacBanned || banInfo.GameBanCount > 0))
                {
                    _log.Warning("The account has a ban on record. " +
                                 "If the VAC/Game ban ban is from CS:GO, a {Mode} is not possible. " +
                                 "Proceeding with caution.", _reportInfo != null ? "report" :"commend");
                    Result = Result.AccountBanned;
                }

                _log.Debug("Registering that we're playing CS:GO...");

                _steamFriends.SetPersonaState(EPersonaState.Online);

                var playGames = new ClientMsgProtobuf <CMsgClientGamesPlayed>(EMsg.ClientGamesPlayed);
                if (_idleInfo != null)
                {
                    foreach (var gameID in _idleInfo.GameID)
                    {
                        var gamesPlayed = new CMsgClientGamesPlayed.GamePlayed
                        {
                            game_id = Convert.ToUInt64(gameID)
                        };

                        if (gameID == 0)
                        {
                            gamesPlayed.game_extra_info = Titan.Instance.UIManager.GetForm <General>(UIType.General)
                                                          .CustomGameName;
                        }

                        playGames.Body.games_played.Add(gamesPlayed);
                    }
                }
                else
                {
                    playGames.Body.games_played.Add(new CMsgClientGamesPlayed.GamePlayed
                    {
                        game_id = 730
                    });
                }
                _steamClient.Send(playGames);

                Thread.Sleep(5000);


                if (_idleInfo == null)
                {
                    _log.Debug("Successfully registered playing CS:GO. Sending client hello to CS:GO services.");

                    var clientHello =
                        new ClientGCMsgProtobuf <CMsgClientHello>((uint)EGCBaseClientMsg.k_EMsgGCClientHello);
                    _gameCoordinator.Send(clientHello, 730);
                }
                else
                {
                    Trigger = TriggerBuilder.Create()
                              .WithIdentity("Idle Trigger - " + JsonAccount.Username + " (Unprotected)", "Titan")
                              .StartNow()
                              .WithSimpleSchedule(x => x
                                                  .WithIntervalInMinutes(_idleInfo.Minutes)
                                                  .WithRepeatCount(1))
                              .Build();

                    Titan.Instance.Scheduler.ScheduleJob(Job, Trigger);

                    _idleInfo.StartTick = DateTime.Now.Ticks;

                    _log.Debug("Successfully registered idling in requested games. Starting scheduler.");
                }
                break;

            case EResult.AccountLoginDeniedNeedTwoFactor:
            case EResult.AccountLogonDenied:
                _log.Debug("Two Factor Authentification is activated on this account. Please set " +
                           "Sentry to {true} in the accounts.json for this account.", true);

                Stop();

                IsRunning = false;
                Result    = Result.SentryRequired;
                break;

            case EResult.InvalidPassword:
            case EResult.NoConnection:
            case EResult.Timeout:
            case EResult.TryAnotherCM:
            case EResult.TwoFactorCodeMismatch:
            case EResult.ServiceUnavailable:
                _log.Error("Unable to connect to Steam: {Reason}. Retrying...", callback.ExtendedResult);

                break;

            case EResult.RateLimitExceeded:
                _log.Debug("Steam Rate Limit has been reached. Please try it again in a few minutes...");

                Stop();

                IsRunning = false;
                Result    = Result.RateLimit;
                break;

            case EResult.AccountDisabled:
                _log.Error("This account has been permanently disabled by the Steam network.");

                Stop();

                IsRunning = false;
                Result    = Result.AccountBanned;
                break;

            default:
                _log.Error("Unable to logon to account: {Result}: {ExtendedResult}", callback.Result, callback.ExtendedResult);

                Stop();
                IsRunning = false;
                break;
            }
        }
예제 #4
0
        public virtual async Task Run()
        {
            ILog log = LogProvider.GetLogger(typeof(LoadExample));

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory();
            IScheduler        sched = await sf.GetScheduler();

            log.Info("------- Initialization Complete -----------");

            log.Info("------- Scheduling Jobs -------------------");

            Random r = new Random();

            // schedule 500 jobs to run
            for (int count = 1; count <= NumberOfJobs; count++)
            {
                IJobDetail job = JobBuilder
                                 .Create <SimpleJob>()
                                 .WithIdentity("job" + count, "group_1")
                                 .RequestRecovery() // ask scheduler to re-execute this job if it was in progress when the scheduler went down...
                                 .Build();

                // tell the job to delay some small amount... to simulate work...
                long timeDelay = (long)(r.NextDouble() * 2500);
                job.JobDataMap.Put(SimpleJob.DelayTime, timeDelay);

                ITrigger trigger = TriggerBuilder.Create()
                                   .WithIdentity("trigger_" + count, "group_1")
                                   .StartAt(DateBuilder.FutureDate((10000 + (count * 100)), IntervalUnit.Millisecond)) // space fire times a small bit
                                   .Build();

                await sched.ScheduleJob(job, trigger);

                if (count % 25 == 0)
                {
                    log.Info("...scheduled " + count + " jobs");
                }
            }

            log.Info("------- Starting Scheduler ----------------");

            // start the schedule
            await sched.Start();

            log.Info("------- Started Scheduler -----------------");

            log.Info("------- Waiting five minutes... -----------");

            // wait five minutes to give our jobs a chance to run
            await Task.Delay(TimeSpan.FromMinutes(5));

            // shut down the scheduler
            log.Info("------- Shutting Down ---------------------");
            await sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");

            SchedulerMetaData metaData = await sched.GetMetaData();

            log.Info("Executed " + metaData.NumberOfJobsExecuted + " jobs.");
        }
예제 #5
0
        private void StartPlan()
        {
            string xmlFile   = base.Server.MapPath("/JobConfig.xml");
            string nodeValue = XmlHelper.GetNodeValue(xmlFile, "JobName");
            string str3      = XmlHelper.GetNodeValue(xmlFile, "JobGoup");
            string str4      = XmlHelper.GetNodeValue(xmlFile, "CronSchedule");

            this.sched = new StdSchedulerFactory().GetScheduler();
            IJobDetail detail  = JobBuilder.Create <Hidistro.UI.Web.Jobs.ShiftNotify>().WithIdentity(nodeValue, str3).Build();
            ITrigger   trigger = CronScheduleTriggerBuilderExtensions.WithCronSchedule(TriggerBuilder.Create().WithIdentity(nodeValue, str3), str4).Build();

            this.sched.ScheduleJob(detail, trigger);
            this.sched.Start();
        }
예제 #6
0
        private async Task InitJobAsync(IServiceScope scope)
        {
            using (scope)
            {
                var f = scope.ServiceProvider.GetRequiredService <ISingletonJobFactory>();

                var now = DateTime.Now;
                async Task ScheduleSaveRankeAsync(RankLevels level)
                {
                    var jobIdentity = JobBuilder.Create <SaveRankJob>()
                                      .WithIdentity(nameof(SaveRankJob) + level.ToString())
                                      .RequestRecovery()
                                      .Build();
                    TimeSpan rep       = default;
                    DateTime startTime = default;

                    if (level == RankLevels.Hour)
                    {
                        rep       = TimeSpan.FromHours(1);
                        startTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, 1, 0).AddHours(1);
                    }
                    else if (level == RankLevels.Day)
                    {
                        rep       = TimeSpan.FromDays(1);
                        startTime = new DateTime(now.Year, now.Month, now.Day, 0, 30, 0).AddDays(1);;
                    }
                    else if (level == RankLevels.Month)
                    {
                        rep       = TimeSpan.FromDays(32);
                        startTime = new DateTime(now.Year, now.Month, 1, 1, 0, 0).AddMonths(1);
                    }

                    var trigger = TriggerBuilder.Create()
                                  .StartAt(new DateTimeOffset(startTime))
                                  .WithSimpleSchedule(b =>
                    {
                        b.WithInterval(rep).RepeatForever();
                    })
                                  .Build();
                    var scheduler = await f.GetSchedulerAsync();

                    var offset = await scheduler.ScheduleJob(jobIdentity, trigger);
                }

                await ScheduleSaveRankeAsync(RankLevels.Hour);
                await ScheduleSaveRankeAsync(RankLevels.Day);
                await ScheduleSaveRankeAsync(RankLevels.Month);

                var config = scope.ServiceProvider.GetRequiredService <IConfiguration>();

                var syncInterval = config.GetValue <int>("BookshelfSync:IntervalS");

                if (syncInterval <= 0)
                {
                    syncInterval = 60 * 5;
                }

                var jobIdentity = JobBuilder.Create <StoreBookshelfJob>()
                                  .WithIdentity(nameof(StoreBookshelfJob))
                                  .RequestRecovery()
                                  .Build();
                var trigger = TriggerBuilder.Create()
                              .StartNow()
                              .WithSimpleSchedule(b =>
                {
                    b.WithIntervalInSeconds(syncInterval).RepeatForever();
                })
                              .Build();
                var scheduler = await f.GetSchedulerAsync();

                var offset = await scheduler.ScheduleJob(jobIdentity, trigger);
            }
        }
예제 #7
0
        protected override async Task InitScheduler(IScheduler scheduler)
        {
            // construct job info
            var jobDetail = JobBuilder.Create <HelloJob>()
                            .WithIdentity("myJob")
                            .StoreDurably()
                            .Build();

            // fire every minute
            var trigger = TriggerBuilder.Create()
                          .WithIdentity("myTrigger")
                          .StartNow()
                          .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever())
                          .Build();

            await scheduler.ScheduleJob(jobDetail, trigger).ConfigureAwait(false);

            // construct job info
            var jobDetail2 = JobBuilder.Create <HelloJob>()
                             .WithIdentity("myJob2")
                             .Build();

            // fire every 3 minutes
            var trigger2 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger2")
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInMinutes(3))
                           .Build();

            await scheduler.ScheduleJob(jobDetail2, trigger2).ConfigureAwait(false);

            var trigger3 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger3")
                           .ForJob(jobDetail2)
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())
                           //.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                           .Build();

            await scheduler.ScheduleJob(trigger3).ConfigureAwait(false);

            // construct job info
            var jobDetail4 = JobBuilder.Create <HelloJob>()
                             .WithIdentity("myJob4", "MyOwnGroup")
                             .Build();

            jobDetail4.JobDataMap.Add("key1", "value1");
            jobDetail4.JobDataMap.Add("key2", "value2");
            jobDetail4.JobDataMap.Add("key3", 1L);
            jobDetail4.JobDataMap.Add("key4", 1d);

            // fire every hour
            ITrigger trigger4 = TriggerBuilder.Create()
                                .WithIdentity("myTrigger4", jobDetail4.Key.Group)
                                .StartNow()
                                .WithSimpleSchedule(x => x.WithIntervalInMinutes(1))
                                .Build();

            ITrigger trigger5 = TriggerBuilder.Create()
                                .WithIdentity("myTrigger5", jobDetail4.Key.Group)
                                .StartNow()
                                .WithCronSchedule("0 0/5 * * * ?")
                                .Build();


            await scheduler.ScheduleJob(jobDetail4, new ReadOnlyCollection <ITrigger>(new[] { trigger4, trigger5 }), false).ConfigureAwait(false);

//            scheduler.ScheduleJob(jobDetail4, trigger5);

            await scheduler.PauseJob(new JobKey("myJob4", "MyOwnGroup")).ConfigureAwait(false);

            await scheduler.PauseTrigger(new TriggerKey("myTrigger3", "DEFAULT")).ConfigureAwait(false);
        }
예제 #8
0
        private static void ScheduleJobs()
        {
            int priority = Jobs.Count;

            foreach (var tsk in Jobs.Where(x => x.TaskType == "S" && x.Status == "Queued")) // O - On Demand ; S- Scheduled.
            {
                var schedule = Schedules.FirstOrDefault(x => x.taskID == tsk.taskID);
                var client   = Machines.FirstOrDefault(x => x.ID == tsk.ClientID);

                IJobDetail job = JobBuilder.Create <Job>().WithIdentity(tsk.TaskName, tsk.ClientID.ToString()).Build();
                job.JobDataMap["command"]  = tsk.Command;
                job.JobDataMap["taskname"] = tsk.TaskName;
                job.JobDataMap["TaskId"]   = tsk.taskID;
                if (client != null)
                {
                    job.JobDataMap["remotepc"] = "\\\\" + client.HostName;
                    job.JobDataMap["username"] = client.Username;
                    job.JobDataMap["password"] = client.Password;
                }


                if (schedule != null)
                {
                    TriggerBuilder tb = TriggerBuilder.Create();
                    tb.WithIdentity(tsk.TaskName);

                    if (schedule.repeatforever <= 0)
                    {
                        tb.WithSimpleSchedule(a => a.WithIntervalInHours(schedule.intHours));
                        tb.WithSimpleSchedule(a => a.WithIntervalInSeconds(schedule.intSec));
                        tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(schedule.intMin));
                    }
                    else
                    {
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInHours(schedule.intHours).RepeatForever());
                        }
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInSeconds(schedule.intSec).RepeatForever());
                        }
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(schedule.intMin).RepeatForever());
                        }
                    }

                    if (schedule.startAt != null)
                    {
                        tb.StartAt(new DateTimeOffset((DateTime)schedule.startAt));
                    }
                    if (schedule.endAt != null)
                    {
                        tb.EndAt(new DateTimeOffset((DateTime)schedule.endAt));
                    }



                    tb.ForJob(job);
                    ITrigger trigger = tb.Build();
                    Scheduler.ScheduleJob(job, trigger);
                }
            }
        }
예제 #9
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Task Scheduler Begins");

            ISchedulerFactory schedFact = new StdSchedulerFactory();

            // get a scheduler, start the schedular before triggers or anything else
            IScheduler sched = schedFact.GetScheduler().Result;

            sched.Start();

            // create job
            IJobDetail job = JobBuilder.Create <HelloWorldJob>()
                             .WithIdentity("job1", "group1")
                             .Build();

            int option = 9;
            HashSet <ITrigger> triggers = new HashSet <ITrigger>();
            //ITrigger trigger = TriggerBuilder.Create().Build();
            ITrigger trigger;

            while (option != 4)
            {
                Console.Write("1. Fire an one time event base on a specific interval specified by the user. \n" +
                              "2. Fire events on a periodic interval(every 5, 10, 15, 20 minutes) using the top of the hour as the starting point. \n" +
                              "3. Fire events on specific days Monday, Wednesday and Friday at a specific times. \n" +
                              "4. Exit \n" +
                              "Enter Option: ");

                #region User Input
                bool tryAgain = true;
                while (tryAgain)
                {
                    try
                    {
                        option   = Int32.Parse(Console.ReadLine());
                        tryAgain = false;
                    }
                    catch (System.FormatException e)
                    {
                        Console.WriteLine("Invalid input. Try again");
                    }
                }
                #endregion

                switch (option)
                {
                case 1:
                    #region Case1
                    Console.WriteLine("Firing an event 2 seconds in the future (OR) at a specific time");

                    trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger1", "group1")
                              .StartAt(DateTime.Now.AddSeconds(2))
                              .Build();

                    sched.ScheduleJob(job, trigger);     // Schedule the job using the job and trigger

                    Console.ReadLine();

                    sched.UnscheduleJob(trigger.Key);     // Unschedule job
                    break;

                    #endregion
                case 2:
                    #region Case2
                    Console.WriteLine("Firing an event every 1 second. The trigger will begin after 2 seconds and will continue until 10 seconds from the start time. (Press ENTER key to stop)");

                    trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger1", "group1")
                              .StartAt(DateTime.Now.AddSeconds(2))
                              .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever())
                              .EndAt(DateTime.Now.AddSeconds(10))
                              .Build();

                    sched.ScheduleJob(job, trigger);     // Schedule the job using the job and trigger

                    Console.ReadLine();

                    sched.UnscheduleJob(trigger.Key);     // Unschedule job
                    break;

                    #endregion
                case 3:
                    #region Case3
                    // Scheduling events using CRON expressions
                    Console.WriteLine("Fire events on specific days Monday, Wednesday and Friday at a specific times. (Press ENTER key to stop)");

                    trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger1", "group1")
                              .StartAt(DateTime.Now)
                              .WithCronSchedule("0/30 55-59 12 ? * TUE,WED")
                              .Build();

                    triggers.Add(trigger);

                    trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger2", "group1")
                              .StartAt(DateTime.Now)
                              .WithCronSchedule("0/7 56-59 12 ? * TUE,THU")
                              .Build();

                    triggers.Add(trigger);

                    trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger3", "group1")
                              .StartAt(DateTime.Now)
                              .WithCronSchedule("0/10 57-49 12 ? * THU,FRI")
                              .Build();

                    triggers.Add(trigger);

                    sched.ScheduleJob(job, triggers, false);     // Schedule the job using the job and trigger list

                    Console.ReadLine();

                    sched.UnscheduleJobs(triggers.Select(x => x.Key).ToList());     // Unschedule all jobs associated with the triggers
                    break;
                    #endregion
                }
            }
        }
예제 #10
0
        /// <summary>
        /// How to compatible old code to SilkierQuartz
        /// </summary>
        /// <param name="app"></param>
        public static void  SchedulerJobs(this IApplicationBuilder app)
        {
            IScheduler scheduler = app.GetScheduler();

            {
                var jobData = new JobDataMap();
                jobData.Put("DateFrom", DateTime.Now);
                jobData.Put("QuartzAssembly", File.ReadAllBytes(typeof(IScheduler).Assembly.Location));

                var job = JobBuilder.Create <DummyJob>()
                          .WithIdentity("Sales", "REPORTS")
                          .WithDescription("Hello Job!")
                          .UsingJobData(jobData)
                          .StoreDurably()
                          .Build();
                var trigger = TriggerBuilder.Create()
                              .WithIdentity("MorningSales")
                              .StartNow()
                              .WithCronSchedule("0 0 8 1/1 * ? *")
                              .Build();
                if (!scheduler.CheckExists(job.Key).GetAwaiter().GetResult())
                {
                    scheduler.ScheduleJob(job, trigger).Wait();
                }


                trigger = TriggerBuilder.Create()
                          .WithIdentity("MonthlySales")
                          .ForJob(job.Key)
                          .StartNow()
                          .WithCronSchedule("0 0 12 1 1/1 ? *")
                          .Build();
                if (!scheduler.CheckExists(trigger.Key).GetAwaiter().GetResult())
                {
                    scheduler.ScheduleJob(trigger).Wait();;
                }
                scheduler.PauseTrigger(trigger.Key).Wait();;

                trigger = TriggerBuilder.Create()
                          .WithIdentity("HourlySales")
                          .ForJob(job.Key)
                          .StartNow()
                          .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())
                          .Build();
                if (!scheduler.CheckExists(trigger.Key).GetAwaiter().GetResult())
                {
                    scheduler.ScheduleJob(trigger).Wait();;
                }
            }
            Task.Run(async() =>
            {
                var job = JobBuilder.Create <DummyJob>().WithIdentity("Job1").StoreDurably().Build();
                await scheduler.AddJob(job, false);
                job = JobBuilder.Create <DummyJob>().WithIdentity("Job2").StoreDurably().Build();
                await scheduler.AddJob(job, false);
                job = JobBuilder.Create <DummyJob>().WithIdentity("Job3").StoreDurably().Build();
                await scheduler.AddJob(job, false);
                job = JobBuilder.Create <DummyJob>().WithIdentity("Job4").StoreDurably().Build();
                await scheduler.AddJob(job, false);
                job = JobBuilder.Create <DummyJob>().WithIdentity("Job5").StoreDurably().Build();
                await scheduler.AddJob(job, false);
                job = JobBuilder.Create <DummyJob>().WithIdentity("Send SMS", "CRITICAL").StoreDurably().RequestRecovery().Build();
                await scheduler.AddJob(job, false);

                var trigger = TriggerBuilder.Create()
                              .WithIdentity("PushAds  (US)")
                              .ForJob(job.Key)
                              .UsingJobData("Location", "US")
                              .StartNow()
                              .WithCronSchedule("0 0/5 * 1/1 * ? *")
                              .Build();
                await scheduler.ScheduleJob(trigger);

                trigger = TriggerBuilder.Create()
                          .WithIdentity("PushAds (EU)")
                          .ForJob(job.Key)
                          .UsingJobData("Location", "EU")
                          .StartNow()
                          .WithCronSchedule("0 0/7 * 1/1 * ? *")
                          .Build();
                await scheduler.ScheduleJob(trigger);
                await scheduler.PauseTriggers(GroupMatcher <TriggerKey> .GroupEquals("LONGRUNNING"));

                job = JobBuilder.Create <DummyJob>().WithIdentity("Send Push", "CRITICAL").StoreDurably().RequestRecovery().Build();
                await scheduler.AddJob(job, false);
            });
            Task.Run(async() =>
            {
                var job = JobBuilder.Create <DisallowConcurrentJob>()
                          .WithIdentity("Load CSV", "IMPORT")
                          .StoreDurably()
                          .Build();
                var trigger = TriggerBuilder.Create()
                              .WithIdentity("CSV_small", "FREQUENTLY")
                              .ForJob(job)
                              .StartNow()
                              .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                              .Build();
                await scheduler.ScheduleJob(job, trigger);
                trigger = TriggerBuilder.Create()
                          .WithIdentity("CSV_big", "LONGRUNNING")
                          .ForJob(job)
                          .StartNow()
                          .WithDailyTimeIntervalSchedule(x => x.OnMondayThroughFriday())
                          .Build();
                await scheduler.ScheduleJob(trigger);
            });
        }
예제 #11
0
        /// <summary>
        /// ��������
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="start">�Ƿ���������</param>
        /// <returns></returns>
        private async Task <IResultModel> AddJob(JobEntity entity, bool start = false)
        {
            var jobClassType = Type.GetType(entity.JobClass);

            if (jobClassType == null)
            {
                return(ResultModel.Failed($"������({entity.JobClass})������"));
            }

            var jobKey         = new JobKey(entity.Code, entity.Group);
            var job            = JobBuilder.Create(jobClassType).WithIdentity(jobKey).UsingJobData("id", entity.Id.ToString()).Build();
            var triggerBuilder = TriggerBuilder.Create().WithIdentity(entity.Code, entity.Group)
                                 .EndAt(entity.EndDate.ToUniversalTime())
                                 .WithDescription(entity.Name);

            //�����ʼ����С�ڵ��ڵ�ǰ��������������
            if (entity.BeginDate <= DateTime.Now)
            {
                triggerBuilder.StartNow();
            }
            else
            {
                triggerBuilder.StartAt(entity.BeginDate.ToUniversalTime());
            }

            if (entity.TriggerType == TriggerType.Simple)
            {
                //������
                triggerBuilder.WithSimpleSchedule(builder =>
                {
                    builder.WithIntervalInSeconds(entity.Interval);
                    if (entity.RepeatCount > 0)
                    {
                        builder.WithRepeatCount(entity.RepeatCount - 1);
                    }
                    else
                    {
                        builder.RepeatForever();
                    }
                });
            }
            else
            {
                if (!CronExpression.IsValidExpression(entity.Cron))
                {
                    return(ResultModel.Failed("CRON����ʽ��Ч"));
                }

                //CRON����
                triggerBuilder.WithCronSchedule(entity.Cron);
            }

            var trigger = triggerBuilder.Build();

            try
            {
                await _quartzServer.AddJob(job, trigger);

                if (!start)
                {
                    //����ͣ
                    await _quartzServer.PauseJob(jobKey);
                }

                return(ResultModel.Success());
            }
            catch (Exception ex)
            {
                _logger.LogError("���������������ʧ��" + ex);
            }

            return(ResultModel.Failed());
        }
예제 #12
0
        private IScheduler CreateScheduler()
        {
            var schedulerFactory = new StdSchedulerFactory();

            var scheduler = schedulerFactory.GetScheduler();

            // construct job info
            var jobDetail = JobBuilder.Create <HelloJob>()
                            .WithIdentity("myJob")
                            .StoreDurably()
                            .Build();

            // fire every minute
            var trigger = TriggerBuilder.Create()
                          .WithIdentity("myTrigger")
                          .StartNow()
                          .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever().WithMisfireHandlingInstructionNextWithRemainingCount())
                          .Build();

            scheduler.ScheduleJob(jobDetail, trigger);

            // construct job info
            var jobDetail2 = JobBuilder.Create <HelloJob>()
                             .WithIdentity("myJob2")
                             .Build();

            // fire every 3 minutes
            var trigger2 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger2")
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInMinutes(3).WithMisfireHandlingInstructionIgnoreMisfires())
                           .Build();

            scheduler.ScheduleJob(jobDetail2, trigger2);

            var trigger3 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger3")
                           .ForJob(jobDetail2)
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())
                           //.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                           .Build();

            scheduler.ScheduleJob(trigger3);

            // construct job info
            var jobDetail4 = JobBuilder.Create <HelloJob>()
                             .WithIdentity("myJob4", "MyOwnGroup")
                             .Build();

            jobDetail4.JobDataMap.Add("key1", "value1");
            jobDetail4.JobDataMap.Add("key2", "value2");
            jobDetail4.JobDataMap.Add("key3", 1L);
            jobDetail4.JobDataMap.Add("key4", 1d);
            jobDetail4.JobDataMap.Add("key5", new[]
            {
                "Test1",
                "Test2",
                "Test3"
            });
            jobDetail4.JobDataMap.Add("key6", new { FirstName = "John", LastName = "Smith", BirthDate = new DateTime(2011, 03, 08) });

            // fire every hour
            ITrigger trigger4 = TriggerBuilder.Create()
                                .WithIdentity("myTrigger4", jobDetail4.Key.Group)
                                .StartNow()
                                .WithSimpleSchedule(x => x.WithIntervalInMinutes(1))
                                .Build();

            ITrigger trigger5 = TriggerBuilder.Create()
                                .WithIdentity("myTrigger5", jobDetail4.Key.Group)
                                .StartNow()
                                .WithCronSchedule("0 0/5 * * * ?")
                                .Build();


            scheduler.ScheduleJob(jobDetail4, new HashSet <ITrigger>(new[] { trigger4, trigger5 }), false);
            //            scheduler.ScheduleJob(jobDetail4, trigger5);

            scheduler.PauseJob(new JobKey("myJob4", "MyOwnGroup"));
            scheduler.PauseTrigger(new TriggerKey("myTrigger3", "DEFAULT"));
            scheduler.Start();

            return(scheduler);
        }
예제 #13
0
        public virtual async Task Run()
        {
            ILog log = LogProvider.GetLogger(typeof(JobStateExample));

            log.Info("------- Initializing -------------------");

            // First we must get a reference to a scheduler
            var properties = new NameValueCollection
            {
                ["quartz.serializer.type"] = "json"
            };
            ISchedulerFactory sf    = new StdSchedulerFactory(properties);
            IScheduler        sched = await sf.GetScheduler();

            log.Info("------- Initialization Complete --------");

            log.Info("------- Scheduling Jobs ----------------");

            // get a "nice round" time a few seconds in the future....
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);

            // job1 will only run 5 times (at start time, plus 4 repeats), every 10 seconds
            IJobDetail job1 = JobBuilder.Create <ColorJob>()
                              .WithIdentity("job1", "group1")
                              .Build();

            ISimpleTrigger trigger1 = (ISimpleTrigger)TriggerBuilder.Create()
                                      .WithIdentity("trigger1", "group1")
                                      .StartAt(startTime)
                                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(4))
                                      .Build();

            // pass initialization parameters into the job
            job1.JobDataMap.Put(ColorJob.FavoriteColor, "Green");
            job1.JobDataMap.Put(ColorJob.ExecutionCount, 1);

            // schedule the job to run
            DateTimeOffset scheduleTime1 = await sched.ScheduleJob(job1, trigger1);

            log.Info($"{job1.Key} will run at: {scheduleTime1.ToString("r")} and repeat: {trigger1.RepeatCount} times, every {trigger1.RepeatInterval.TotalSeconds} seconds");

            // job2 will also run 5 times, every 10 seconds

            IJobDetail job2 = JobBuilder.Create <ColorJob>()
                              .WithIdentity("job2", "group1")
                              .Build();

            ISimpleTrigger trigger2 = (ISimpleTrigger)TriggerBuilder.Create()
                                      .WithIdentity("trigger2", "group1")
                                      .StartAt(startTime)
                                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(4))
                                      .Build();

            // pass initialization parameters into the job
            // this job has a different favorite color!
            job2.JobDataMap.Put(ColorJob.FavoriteColor, "Red");
            job2.JobDataMap.Put(ColorJob.ExecutionCount, 1);

            // schedule the job to run
            DateTimeOffset scheduleTime2 = await sched.ScheduleJob(job2, trigger2);

            log.Info($"{job2.Key} will run at: {scheduleTime2.ToString("r")} and repeat: {trigger2.RepeatCount} times, every {trigger2.RepeatInterval.TotalSeconds} seconds");

            log.Info("------- Starting Scheduler ----------------");

            // All of the jobs have been added to the scheduler, but none of the jobs
            // will run until the scheduler has been started
            await sched.Start();

            log.Info("------- Started Scheduler -----------------");

            log.Info("------- Waiting 60 seconds... -------------");

            // wait five minutes to show jobs
            await Task.Delay(TimeSpan.FromMinutes(5));

            // executing...

            log.Info("------- Shutting Down ---------------------");

            await sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");

            SchedulerMetaData metaData = await sched.GetMetaData();

            log.Info($"Executed {metaData.NumberOfJobsExecuted} jobs.");
        }
예제 #14
0
        /// <summary>
        /// Executes this instance.
        /// </summary>
        public void Execute()
        {
            using (var rockContext = new RockContext())
            {
                var jobService = new ServiceJobService(rockContext);

                ServiceJob job = jobService.Get(JobId);
                if (job != null)
                {
                    try
                    {
                        // create a scheduler specific for the job
                        var scheduleConfig      = new System.Collections.Specialized.NameValueCollection();
                        var runNowSchedulerName = ("RunNow:" + job.Guid.ToString("N")).Truncate(40);
                        scheduleConfig.Add(StdSchedulerFactory.PropertySchedulerInstanceName, runNowSchedulerName);
                        var schedulerFactory = new StdSchedulerFactory(scheduleConfig);
                        var sched            = new StdSchedulerFactory(scheduleConfig).GetScheduler();
                        if (sched.IsStarted)
                        {
                            // the job is currently running as a RunNow job
                            return;
                        }

                        // create the quartz job and trigger
                        IJobDetail jobDetail  = jobService.BuildQuartzJob(job);
                        var        jobTrigger = TriggerBuilder.Create()
                                                .WithIdentity(job.Guid.ToString(), job.Name)
                                                .StartNow()
                                                .Build();

                        // schedule the job
                        sched.ScheduleJob(jobDetail, jobTrigger);

                        // set up the listener to report back from the job when it completes
                        sched.ListenerManager.AddJobListener(new RockJobListener(), EverythingMatcher <JobKey> .AllJobs());

                        // start the scheduler
                        sched.Start();

                        // Wait 10secs to give job chance to start
                        System.Threading.Tasks.Task.Delay(new TimeSpan(0, 0, 10)).Wait();

                        // stop the scheduler when done with job
                        sched.Shutdown(true);
                    }

                    catch (Exception ex)
                    {
                        // create a friendly error message
                        ExceptionLogService.LogException(ex, null);
                        string message = string.Format("Error doing a 'Run Now' on job: {0}. \n\n{2}", job.Name, job.Assembly, ex.Message);
                        job.LastStatusMessage = message;
                        job.LastStatus        = "Error Loading Job";
                        rockContext.SaveChanges();

                        var jobHistoryService = new ServiceJobHistoryService(rockContext);
                        var jobHistory        = new ServiceJobHistory()
                        {
                            ServiceJobId  = job.Id,
                            StartDateTime = RockDateTime.Now,
                            StopDateTime  = RockDateTime.Now,
                            Status        = job.LastStatus,
                            StatusMessage = job.LastStatusMessage
                        };
                        jobHistoryService.Add(jobHistory);
                        rockContext.SaveChanges();
                    }
                }
            }
        }
 internal MonthlyTriggerBuilder(BuilderInfo taskBuilder, MonthsOfTheYear moy)
     : base(taskBuilder)
 {
     this.trb = new TriggerBuilder(taskBuilder, moy);
 }
예제 #16
0
        public async Task <string> Start(List <string> param)
        {
            //    string SqlLiteConn = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? "Data Source=Db/LogData.dll;" : "Data Source=Db\\LogData.dll;";
            //    using (var logW = new FreeSqlBuilder()
            //.UseConnectionFactory(FreeSql.DataType.Sqlite, () => new System.Data.SQLite.SQLiteConnection(SqlLiteConn))
            // .UseAutoSyncStructure(false)
            // .Build())
            //    {
            //        var logs = new List<Logs>();
            //        for (int i = 0; i < 100000; i++)
            //        {
            //            logs.Add(new Logs
            //            {
            //                Application = "test",
            //                EventId = "test",
            //                Level = "test",
            //                Logger = "freesqlLogger",
            //                Message = i.ToString() + "当前线程id" + Thread.CurrentThread.ManagedThreadId,
            //                TimestampUtc = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

            //            });
            //        }
            //        _ = logW.Insert(logs).NoneParameter(true).ExecuteAffrows();
            //        logs = null;
            //    }
            //    return "";
            //  await LogDela();
            //return await Task.FromResult($"开启失败,失败原因");
            try
            {
                int Second = 0;
                if (param.Count > 1 && _scheduler != null)
                {
                    await Stop();
                }
                for (int i = 0; i < param.Count; i++)
                {
                    //计算出事件的秒数
                    var ts = await _sqliteFSql.Select <TaskPlan>().Where(o => o.GUID == param[i]).FirstAsync();

                    switch (ts.FrequencyType)
                    {
                    case "0":
                        Second = int.Parse(ts.Frequency);
                        break;

                    case "1":
                        Second = int.Parse(ts.Frequency) * 60;
                        break;

                    case "2":
                        Second = int.Parse(ts.Frequency) * 3600;
                        break;

                    default:
                        break;
                    }


                    //2、通过调度工厂获得调度器
                    _scheduler = await _schedulerFactory.GetScheduler();

                    _scheduler.JobFactory = this._iocJobfactory;
                    //  替换默认工厂
                    //3、开启调度器
                    _logger.LogInformation("定时任务({EventId})启动", ts.Name);

                    await _scheduler.Start();

                    //4、创建一个触发器
                    var trigger = TriggerBuilder.Create()
                                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(Second).RepeatForever())
                                  .Build();
                    IJobDetail jobDetail;
                    //5、创建任务 0是dll 模式 1是api模式
                    if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                    {
                        if (rds.ContainsKey(param[i].ToString()))
                        {
                            return(await Task.FromResult($"已经开启过任务{ts.Name}不允许重复开启!"));
                        }


                        if (ts.WorkType == "0")
                        {
                            jobDetail = JobBuilder.Create <AutoTaskJobDll>()
                                        .WithIdentity(param[i].ToString(), "group")
                                        .UsingJobData("guid", param[i].ToString())
                                        .Build();
                        }
                        else
                        {
                            jobDetail = JobBuilder.Create <AutoTaskJob>()
                                        .WithIdentity(param[i].ToString(), "group")
                                        .UsingJobData("guid", param[i].ToString())
                                        .Build();
                        }

                        rds.Set(param[i].ToString(), jobDetail.Key);
                    }
                    else
                    {
                        if (ts.Status == "1" || jobKeys.ContainsKey(param[i].ToString()))
                        {
                            return(await Task.FromResult($"已经开启过任务{ts.Name}不允许重复开启!"));
                        }
                        else
                        {
                            if (ts.WorkType == "0")
                            {
                                jobDetail = JobBuilder.Create <AutoTaskJobDll>()
                                            .WithIdentity(param[i].ToString(), "group")
                                            .UsingJobData("guid", param[i].ToString())
                                            .Build();
                            }
                            else
                            {
                                jobDetail = JobBuilder.Create <AutoTaskJob>()
                                            .WithIdentity(param[i].ToString(), "group")
                                            .UsingJobData("guid", param[i].ToString())
                                            .Build();
                            }

                            ts.Status = "1";

                            _sqliteFSql.Update <TaskPlan>()
                            .Set(a => a.Status, ts.Status)
                            .Where(a => a.GUID == ts.GUID)
                            .ExecuteAffrows();
                            jobKeys.Add(param[i].ToString(), jobDetail.Key);
                        }
                    }
                    //6、将触发器和任务器绑定到调度器中

                    await _scheduler.ScheduleJob(jobDetail, trigger);
                }
                // return await Task.FromResult("0");
                return("0");
            }
            catch (Exception ex)
            {
                _logger.LogError($"开启失败,失败原因:{ex.Message}");
                //return await Task.FromResult($"开启失败,失败原因:{ex.Message}");
                return($"开启失败,失败原因:{ex.Message}");
            }
        }
예제 #17
0
        /// <summary>
        /// Application specific configuration
        /// This method should initialize any IoC resources utilized by your web service classes.
        /// </summary>
        /// <param name="container"></param>
        public override void Configure(Container container)
        {
            SetConfig(new HostConfig {
                DebugMode = AppSettings.Get("DebugMode", Env.IsWindows),
            });

            // override config
            var quartzConfig = ConfigureQuartz();

            // register plugin, will scan assemblies by default for jobs
            var quartzFeature = new QuartzFeature();

            Plugins.Add(quartzFeature);
            Plugins.Add(new PostmanFeature());

            // or you can register the plugin with custom config source
            Plugins.AddIfNotExists(new QuartzFeature {
                Config = quartzConfig
            });

            // or you can register plugin with custom job assemblies
            Plugins.AddIfNotExists(new QuartzFeature
            {
                ScanAppHostAssemblies = false,
                JobAssemblies         = new[] { typeof(HelloJob).Assembly, typeof(AppHost).Assembly }
            });

            // now you can setup a job to run with a trigger
            quartzFeature.RegisterJob <HelloJob>(
                trigger =>
                trigger.WithSimpleSchedule(s =>
                                           s.WithInterval(TimeSpan.FromMinutes(1))
                                           .RepeatForever()
                                           )
                .Build()
                );

            // or setup a job to run with a trigger and some data
            quartzFeature.RegisterJob <HelloJob>(
                trigger =>
                trigger.WithSimpleSchedule(s =>
                                           s.WithIntervalInMinutes(1)
                                           .WithRepeatCount(10)
                                           )
                .Build(),
                builder => builder.UsingJobData("Name", "Bob").Build()
                );

            // cron schedule trigger
            var cronTrigger = TriggerBuilder.Create()
                              .WithCronSchedule("0 0 0/1 1/1 * ? *")
                              .Build();

            quartzFeature.RegisterJob <HelloJob>(cronTrigger);

            // you can setup jobs with data and triggers however you like
            // this lets create a trigger with our preferred identity
            var everyHourTrigger = TriggerBuilder.Create()
                                   .WithDescription("This is my trigger!")
                                   .WithIdentity("everyHour", "Continuous")
                                   .WithDailyTimeIntervalSchedule(x => x.OnMondayThroughFriday().WithIntervalInHours(1))
                                   .Build();

            var jobData = JobBuilder.Create <HelloJob>().UsingJobData("Name", "Sharon").Build();

            quartzFeature.RegisterJob <HelloJob>(everyHourTrigger);
            quartzFeature.RegisterJob <HelloJob>(everyHourTrigger, jobData);
        }
예제 #18
0
        private void ScheduleWorkflow(Workflow wf)
        {
            if (wf.IsEnabled)
            {
                if (wf.LaunchType == LaunchType.Startup)
                {
                    wf.Start();
                }
                else if (wf.LaunchType == LaunchType.Periodic)
                {
                    IDictionary <string, object> map = new Dictionary <string, object>();
                    map.Add("workflow", wf);

                    string     jobIdentity = "Workflow Job " + wf.Id;
                    IJobDetail jobDetail   = JobBuilder.Create <WorkflowJob>()
                                             .WithIdentity(jobIdentity)
                                             .SetJobData(new JobDataMap(map))
                                             .Build();

                    ITrigger trigger = TriggerBuilder.Create()
                                       .ForJob(jobDetail)
                                       .WithSimpleSchedule(x => x.WithInterval(wf.Period).RepeatForever())
                                       .WithIdentity("Workflow Trigger " + wf.Id)
                                       .StartNow()
                                       .Build();

                    var jobKey = new JobKey(jobIdentity);
                    if (QuartzScheduler.CheckExists(jobKey))
                    {
                        QuartzScheduler.DeleteJob(jobKey);
                    }

                    QuartzScheduler.ScheduleJob(jobDetail, trigger);
                }
                else if (wf.LaunchType == LaunchType.Cron)
                {
                    IDictionary <string, object> map = new Dictionary <string, object>();
                    map.Add("workflow", wf);

                    string     jobIdentity = "Workflow Job " + wf.Id;
                    IJobDetail jobDetail   = JobBuilder.Create <WorkflowJob>()
                                             .WithIdentity(jobIdentity)
                                             .SetJobData(new JobDataMap(map))
                                             .Build();

                    ITrigger trigger = TriggerBuilder.Create()
                                       .ForJob(jobDetail)
                                       .WithCronSchedule(wf.CronExpression)
                                       .WithIdentity("Workflow Trigger " + wf.Id)
                                       .StartNow()
                                       .Build();

                    var jobKey = new JobKey(jobIdentity);
                    if (QuartzScheduler.CheckExists(jobKey))
                    {
                        QuartzScheduler.DeleteJob(jobKey);
                    }

                    QuartzScheduler.ScheduleJob(jobDetail, trigger);
                }
            }
        }
예제 #19
0
        public virtual async Task Run()
        {
            ILog log = LogProvider.GetLogger(typeof(SimpleTriggerExample));

            log.Info("------- Initializing -------------------");

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory();
            IScheduler        sched = await sf.GetScheduler();

            log.Info("------- Initialization Complete --------");

            log.Info("------- Scheduling Jobs ----------------");

            // jobs can be scheduled before sched.start() has been called

            // get a "nice round" time a few seconds in the future...
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 15);

            // job1 will only fire once at date/time "ts"
            IJobDetail job = JobBuilder.Create <SimpleJob>()
                             .WithIdentity("job1", "group1")
                             .Build();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("trigger1", "group1")
                                     .StartAt(startTime)
                                     .Build();

            // schedule it to run!
            DateTimeOffset?ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // job2 will only fire once at date/time "ts"
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job2", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger2", "group1")
                      .StartAt(startTime)
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // job3 will run 11 times (run once and repeat 10 more times)
            // job3 will repeat every 10 seconds
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job3", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger3", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(10))
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // the same job (job3) will be scheduled by a another trigger
            // this time will only repeat twice at a 70 second interval

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger3", "group2")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(2))
                      .ForJob(job)
                      .Build();

            ft = await sched.ScheduleJob(trigger);

            log.Info(job.Key +
                     " will [also] run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // job4 will run 6 times (run once and repeat 5 more times)
            // job4 will repeat every 10 seconds
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job4", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger4", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(5))
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // job5 will run once, five minutes in the future
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job5", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger5", "group1")
                      .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute))
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // job6 will run indefinitely, every 40 seconds
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job6", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger6", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInSeconds(40).RepeatForever())
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            log.Info("------- Starting Scheduler ----------------");

            // All of the jobs have been added to the scheduler, but none of the jobs
            // will run until the scheduler has been started
            await sched.Start();

            log.Info("------- Started Scheduler -----------------");

            // jobs can also be scheduled after start() has been called...
            // job7 will repeat 20 times, repeat every five minutes
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job7", "group1")
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger7", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).WithRepeatCount(20))
                      .Build();

            ft = await sched.ScheduleJob(job, trigger);

            log.Info(job.Key +
                     " will run at: " + ft +
                     " and repeat: " + trigger.RepeatCount +
                     " times, every " + trigger.RepeatInterval.TotalSeconds + " seconds");

            // jobs can be fired directly... (rather than waiting for a trigger)
            job = JobBuilder.Create <SimpleJob>()
                  .WithIdentity("job8", "group1")
                  .StoreDurably()
                  .Build();

            await sched.AddJob(job, true);

            log.Info("'Manually' triggering job8...");
            await sched.TriggerJob(new JobKey("job8", "group1"));

            log.Info("------- Waiting 30 seconds... --------------");

            try
            {
                // wait 30 seconds to show jobs
                await Task.Delay(TimeSpan.FromSeconds(30));

                // executing...
            }
            catch (ThreadInterruptedException)
            {
            }

            // jobs can be re-scheduled...
            // job 7 will run immediately and repeat 10 times for every second
            log.Info("------- Rescheduling... --------------------");
            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger7", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).WithRepeatCount(20))
                      .Build();

            ft = await sched.RescheduleJob(trigger.Key, trigger);

            log.Info("job7 rescheduled to run at: " + ft);

            log.Info("------- Waiting five minutes... ------------");
            // wait five minutes to show jobs
            await Task.Delay(TimeSpan.FromMinutes(5));

            // executing...

            log.Info("------- Shutting Down ---------------------");

            await sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");

            // display some stats about the schedule that just ran
            SchedulerMetaData metaData = await sched.GetMetaData();

            log.Info($"Executed {metaData.NumberOfJobsExecuted} jobs.");
        }
        protected virtual void ProcessInternal(string xml)
        {
            PrepForProcessing();

#if XML_SCHEMA
            ValidateXml(xml);
#endif // XML_SCHEMA
            MaybeThrowValidationException();

            // deserialize as object model
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            if (data == null)
            {
                throw new SchedulerConfigException("Job definition data from XML was null after deserialization");
            }

            //
            // Extract pre-processing commands
            //
            if (data.preprocessingcommands != null)
            {
                foreach (preprocessingcommandsType command in data.preprocessingcommands)
                {
                    if (command.deletejobsingroup != null)
                    {
                        foreach (string s in command.deletejobsingroup)
                        {
                            string deleteJobGroup = s.NullSafeTrim();
                            if (!string.IsNullOrEmpty(deleteJobGroup))
                            {
                                jobGroupsToDelete.Add(deleteJobGroup);
                            }
                        }
                    }
                    if (command.deletetriggersingroup != null)
                    {
                        foreach (string s in command.deletetriggersingroup)
                        {
                            string deleteTriggerGroup = s.NullSafeTrim();
                            if (!string.IsNullOrEmpty(deleteTriggerGroup))
                            {
                                triggerGroupsToDelete.Add(deleteTriggerGroup);
                            }
                        }
                    }
                    if (command.deletejob != null)
                    {
                        foreach (preprocessingcommandsTypeDeletejob s in command.deletejob)
                        {
                            string name  = s.name.TrimEmptyToNull();
                            string group = s.group.TrimEmptyToNull();

                            if (name == null)
                            {
                                throw new SchedulerConfigException("Encountered a 'delete-job' command without a name specified.");
                            }
                            jobsToDelete.Add(new JobKey(name, group));
                        }
                    }
                    if (command.deletetrigger != null)
                    {
                        foreach (preprocessingcommandsTypeDeletetrigger s in command.deletetrigger)
                        {
                            string name  = s.name.TrimEmptyToNull();
                            string group = s.group.TrimEmptyToNull();

                            if (name == null)
                            {
                                throw new SchedulerConfigException("Encountered a 'delete-trigger' command without a name specified.");
                            }
                            triggersToDelete.Add(new TriggerKey(name, group));
                        }
                    }
                }
            }

            if (Log.IsDebugEnabled())
            {
                Log.Debug("Found " + jobGroupsToDelete.Count + " delete job group commands.");
                Log.Debug("Found " + triggerGroupsToDelete.Count + " delete trigger group commands.");
                Log.Debug("Found " + jobsToDelete.Count + " delete job commands.");
                Log.Debug("Found " + triggersToDelete.Count + " delete trigger commands.");
            }

            //
            // Extract directives
            //
            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool overWrite = data.processingdirectives[0].overwriteexistingdata;
                Log.Debug("Directive 'overwrite-existing-data' specified as: " + overWrite);
                OverWriteExistingData = overWrite;
            }
            else
            {
                Log.Debug("Directive 'overwrite-existing-data' not specified, defaulting to " + OverWriteExistingData);
            }

            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool ignoreduplicates = data.processingdirectives[0].ignoreduplicates;
                Log.Debug("Directive 'ignore-duplicates' specified as: " + ignoreduplicates);
                IgnoreDuplicates = ignoreduplicates;
            }
            else
            {
                Log.Debug("Directive 'ignore-duplicates' not specified, defaulting to " + IgnoreDuplicates);
            }

            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool scheduleRelative = data.processingdirectives[0].scheduletriggerrelativetoreplacedtrigger;
                Log.Debug("Directive 'schedule-trigger-relative-to-replaced-trigger' specified as: " + scheduleRelative);
                ScheduleTriggerRelativeToReplacedTrigger = scheduleRelative;
            }
            else
            {
                Log.Debug("Directive 'schedule-trigger-relative-to-replaced-trigger' not specified, defaulting to " + ScheduleTriggerRelativeToReplacedTrigger);
            }

            //
            // Extract Job definitions...
            //
            List <jobdetailType> jobNodes = new List <jobdetailType>();
            if (data.schedule != null)
            {
                foreach (var schedule in data.schedule)
                {
                    if (schedule?.job != null)
                    {
                        jobNodes.AddRange(schedule.job);
                    }
                }
            }

            Log.Debug("Found " + jobNodes.Count + " job definitions.");

            foreach (jobdetailType jobDetailType in jobNodes)
            {
                string jobName              = jobDetailType.name.TrimEmptyToNull();
                string jobGroup             = jobDetailType.group.TrimEmptyToNull();
                string jobDescription       = jobDetailType.description.TrimEmptyToNull();
                string jobTypeName          = jobDetailType.jobtype.TrimEmptyToNull();
                bool   jobDurability        = jobDetailType.durable;
                bool   jobRecoveryRequested = jobDetailType.recover;

                Type jobType = TypeLoadHelper.LoadType(jobTypeName);


                IJobDetail jobDetail = JobBuilder.Create(jobType)
                                       .WithIdentity(jobName, jobGroup)
                                       .WithDescription(jobDescription)
                                       .StoreDurably(jobDurability)
                                       .RequestRecovery(jobRecoveryRequested)
                                       .Build();

                if (jobDetailType.jobdatamap != null && jobDetailType.jobdatamap.entry != null)
                {
                    foreach (entryType entry in jobDetailType.jobdatamap.entry)
                    {
                        string key   = entry.key.TrimEmptyToNull();
                        string value = entry.value.TrimEmptyToNull();
                        jobDetail.JobDataMap.Add(key, value);
                    }
                }

                if (Log.IsDebugEnabled())
                {
                    Log.Debug("Parsed job definition: " + jobDetail);
                }

                AddJobToSchedule(jobDetail);
            }

            //
            // Extract Trigger definitions...
            //

            List <triggerType> triggerEntries = new List <triggerType>();
            if (data.schedule != null)
            {
                foreach (var schedule in data.schedule)
                {
                    if (schedule != null && schedule.trigger != null)
                    {
                        triggerEntries.AddRange(schedule.trigger);
                    }
                }
            }

            Log.Debug("Found " + triggerEntries.Count + " trigger definitions.");

            foreach (triggerType triggerNode in triggerEntries)
            {
                string triggerName        = triggerNode.Item.name.TrimEmptyToNull();
                string triggerGroup       = triggerNode.Item.group.TrimEmptyToNull();
                string triggerDescription = triggerNode.Item.description.TrimEmptyToNull();
                string triggerCalendarRef = triggerNode.Item.calendarname.TrimEmptyToNull();
                string triggerJobName     = triggerNode.Item.jobname.TrimEmptyToNull();
                string triggerJobGroup    = triggerNode.Item.jobgroup.TrimEmptyToNull();

                int triggerPriority = TriggerConstants.DefaultPriority;
                if (!triggerNode.Item.priority.IsNullOrWhiteSpace())
                {
                    triggerPriority = Convert.ToInt32(triggerNode.Item.priority);
                }

                DateTimeOffset triggerStartTime = SystemTime.UtcNow();
                if (triggerNode.Item.Item != null)
                {
                    if (triggerNode.Item.Item is DateTime time)
                    {
                        triggerStartTime = new DateTimeOffset(time);
                    }
                    else
                    {
                        triggerStartTime = triggerStartTime.AddSeconds(Convert.ToInt32(triggerNode.Item.Item));
                    }
                }

                DateTime?triggerEndTime = triggerNode.Item.endtimeSpecified ? triggerNode.Item.endtime : (DateTime?)null;

                IScheduleBuilder sched;

                if (triggerNode.Item is simpleTriggerType simpleTrigger)
                {
                    string repeatCountString    = simpleTrigger.repeatcount.TrimEmptyToNull();
                    string repeatIntervalString = simpleTrigger.repeatinterval.TrimEmptyToNull();

                    int      repeatCount    = ParseSimpleTriggerRepeatCount(repeatCountString);
                    TimeSpan repeatInterval = repeatIntervalString == null ? TimeSpan.Zero : TimeSpan.FromMilliseconds(Convert.ToInt64(repeatIntervalString));

                    sched = SimpleScheduleBuilder.Create()
                            .WithInterval(repeatInterval)
                            .WithRepeatCount(repeatCount);

                    if (!simpleTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((SimpleScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(simpleTrigger.misfireinstruction));
                    }
                }
                else if (triggerNode.Item is cronTriggerType)
                {
                    cronTriggerType cronTrigger    = (cronTriggerType)triggerNode.Item;
                    string          cronExpression = cronTrigger.cronexpression.TrimEmptyToNull();
                    string          timezoneString = cronTrigger.timezone.TrimEmptyToNull();

                    TimeZoneInfo tz = timezoneString != null?TimeZoneUtil.FindTimeZoneById(timezoneString) : null;

                    sched = CronScheduleBuilder.CronSchedule(cronExpression)
                            .InTimeZone(tz);

                    if (!cronTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((CronScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(cronTrigger.misfireinstruction));
                    }
                }
                else if (triggerNode.Item is calendarIntervalTriggerType)
                {
                    calendarIntervalTriggerType calendarIntervalTrigger = (calendarIntervalTriggerType)triggerNode.Item;
                    string repeatIntervalString = calendarIntervalTrigger.repeatinterval.TrimEmptyToNull();

                    IntervalUnit intervalUnit   = ParseDateIntervalTriggerIntervalUnit(calendarIntervalTrigger.repeatintervalunit.TrimEmptyToNull());
                    int          repeatInterval = repeatIntervalString == null ? 0 : Convert.ToInt32(repeatIntervalString);

                    sched = CalendarIntervalScheduleBuilder.Create()
                            .WithInterval(repeatInterval, intervalUnit);

                    if (!calendarIntervalTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((CalendarIntervalScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(calendarIntervalTrigger.misfireinstruction));
                    }
                }
                else
                {
                    throw new SchedulerConfigException("Unknown trigger type in XML configuration");
                }

                IMutableTrigger trigger = (IMutableTrigger)TriggerBuilder.Create()
                                          .WithIdentity(triggerName, triggerGroup)
                                          .WithDescription(triggerDescription)
                                          .ForJob(triggerJobName, triggerJobGroup)
                                          .StartAt(triggerStartTime)
                                          .EndAt(triggerEndTime)
                                          .WithPriority(triggerPriority)
                                          .ModifiedByCalendar(triggerCalendarRef)
                                          .WithSchedule(sched)
                                          .Build();

                if (triggerNode.Item.jobdatamap != null && triggerNode.Item.jobdatamap.entry != null)
                {
                    foreach (entryType entry in triggerNode.Item.jobdatamap.entry)
                    {
                        string key   = entry.key.TrimEmptyToNull();
                        string value = entry.value.TrimEmptyToNull();
                        trigger.JobDataMap.Add(key, value);
                    }
                }

                if (Log.IsDebugEnabled())
                {
                    Log.Debug("Parsed trigger definition: " + trigger);
                }

                AddTriggerToSchedule(trigger);
            }
        }
예제 #21
0
        public void TestBasicStorageFunctions()
        {
            var sched = CreateScheduler("TestBasicStorageFunctions", 2);

            sched.Start();

            // test basic storage functions of scheduler...

            IJobDetail job = JobBuilder.Create()
                             .OfType <TestJob>()
                             .WithIdentity("j1")
                             .StoreDurably()
                             .Build();

            Assert.IsFalse(sched.CheckExists(new JobKey("j1")), "Unexpected existence of job named 'j1'.");

            sched.AddJob(job, false);

            Assert.IsTrue(sched.CheckExists(new JobKey("j1")), "Expected existence of job named 'j1' but checkExists return false.");

            job = sched.GetJobDetail(new JobKey("j1"));

            Assert.IsNotNull(job, "Stored job not found!");

            sched.DeleteJob(new JobKey("j1"));

            ITrigger trigger = TriggerBuilder.Create()
                               .WithIdentity("t1")
                               .ForJob(job)
                               .StartNow()
                               .WithSimpleSchedule(x => x.RepeatForever().WithIntervalInSeconds(5))
                               .Build();

            Assert.IsFalse(sched.CheckExists(new TriggerKey("t1")), "Unexpected existence of trigger named '11'.");

            sched.ScheduleJob(job, trigger);

            Assert.IsTrue(sched.CheckExists(new TriggerKey("t1")), "Expected existence of trigger named 't1' but checkExists return false.");

            job = sched.GetJobDetail(new JobKey("j1"));

            Assert.IsNotNull(job, "Stored job not found!");

            trigger = sched.GetTrigger(new TriggerKey("t1"));

            Assert.IsNotNull(trigger, "Stored trigger not found!");

            job = JobBuilder.Create()
                  .OfType <TestJob>()
                  .WithIdentity("j2", "g1")
                  .Build();

            trigger = TriggerBuilder.Create()
                      .WithIdentity("t2", "g1")
                      .ForJob(job)
                      .StartNow()
                      .WithSimpleSchedule(x => x.RepeatForever().WithIntervalInSeconds(5))
                      .Build();

            sched.ScheduleJob(job, trigger);

            job = JobBuilder.Create()
                  .OfType <TestJob>()
                  .WithIdentity("j3", "g1")
                  .Build();

            trigger = TriggerBuilder.Create()
                      .WithIdentity("t3", "g1")
                      .ForJob(job)
                      .StartNow()
                      .WithSimpleSchedule(x => x.RepeatForever().WithIntervalInSeconds(5))
                      .Build();

            sched.ScheduleJob(job, trigger);


            IList <string> jobGroups     = sched.GetJobGroupNames();
            IList <string> triggerGroups = sched.GetTriggerGroupNames();

            Assert.AreEqual(2, jobGroups.Count, "Job group list size expected to be = 2 ");
            Assert.AreEqual(2, triggerGroups.Count, "Trigger group list size expected to be = 2 ");

            Collection.ISet <JobKey>     jobKeys     = sched.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(JobKey.DefaultGroup));
            Collection.ISet <TriggerKey> triggerKeys = sched.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals(TriggerKey.DefaultGroup));

            Assert.AreEqual(1, jobKeys.Count, "Number of jobs expected in default group was 1 ");
            Assert.AreEqual(1, triggerKeys.Count, "Number of triggers expected in default group was 1 ");

            jobKeys     = sched.GetJobKeys(GroupMatcher <JobKey> .GroupEquals("g1"));
            triggerKeys = sched.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals("g1"));

            Assert.AreEqual(2, jobKeys.Count, "Number of jobs expected in 'g1' group was 2 ");
            Assert.AreEqual(2, triggerKeys.Count, "Number of triggers expected in 'g1' group was 2 ");


            TriggerState s = sched.GetTriggerState(new TriggerKey("t2", "g1"));

            Assert.AreEqual(TriggerState.Normal, s, "State of trigger t2 expected to be NORMAL ");

            sched.PauseTrigger(new TriggerKey("t2", "g1"));
            s = sched.GetTriggerState(new TriggerKey("t2", "g1"));
            Assert.AreEqual(TriggerState.Paused, s, "State of trigger t2 expected to be PAUSED ");

            sched.ResumeTrigger(new TriggerKey("t2", "g1"));
            s = sched.GetTriggerState(new TriggerKey("t2", "g1"));
            Assert.AreEqual(TriggerState.Normal, s, "State of trigger t2 expected to be NORMAL ");

            Collection.ISet <string> pausedGroups = sched.GetPausedTriggerGroups();
            Assert.AreEqual(0, pausedGroups.Count, "Size of paused trigger groups list expected to be 0 ");

            sched.PauseTriggers(GroupMatcher <TriggerKey> .GroupEquals("g1"));

            // test that adding a trigger to a paused group causes the new trigger to be paused also...
            job = JobBuilder.Create()
                  .OfType <TestJob>()
                  .WithIdentity("j4", "g1")
                  .Build();

            trigger = TriggerBuilder.Create()
                      .WithIdentity("t4", "g1")
                      .ForJob(job)
                      .StartNow()
                      .WithSimpleSchedule(x => x.RepeatForever().WithIntervalInSeconds(5))
                      .Build();

            sched.ScheduleJob(job, trigger);

            pausedGroups = sched.GetPausedTriggerGroups();
            Assert.AreEqual(1, pausedGroups.Count, "Size of paused trigger groups list expected to be 1 ");

            s = sched.GetTriggerState(new TriggerKey("t2", "g1"));
            Assert.AreEqual(TriggerState.Paused, s, "State of trigger t2 expected to be PAUSED ");

            s = sched.GetTriggerState(new TriggerKey("t4", "g1"));
            Assert.AreEqual(TriggerState.Paused, s, "State of trigger t4 expected to be PAUSED");

            sched.ResumeTriggers(GroupMatcher <TriggerKey> .GroupEquals("g1"));

            s = sched.GetTriggerState(new TriggerKey("t2", "g1"));
            Assert.AreEqual(TriggerState.Normal, s, "State of trigger t2 expected to be NORMAL ");

            s = sched.GetTriggerState(new TriggerKey("t4", "g1"));
            Assert.AreEqual(TriggerState.Normal, s, "State of trigger t2 expected to be NORMAL ");

            pausedGroups = sched.GetPausedTriggerGroups();
            Assert.AreEqual(0, pausedGroups.Count, "Size of paused trigger groups list expected to be 0 ");


            Assert.IsFalse(sched.UnscheduleJob(new TriggerKey("foasldfksajdflk")), "Scheduler should have returned 'false' from attempt to unschedule non-existing trigger. ");

            Assert.IsTrue(sched.UnscheduleJob(new TriggerKey("t3", "g1")), "Scheduler should have returned 'true' from attempt to unschedule existing trigger. ");

            jobKeys     = sched.GetJobKeys(GroupMatcher <JobKey> .GroupEquals("g1"));
            triggerKeys = sched.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals("g1"));

            Assert.AreEqual(2, jobKeys.Count, "Number of jobs expected in 'g1' group was 2 "); // job should have been deleted also, because it is non-durable
            Assert.AreEqual(2, triggerKeys.Count, "Number of triggers expected in 'g1' group was 2 ");

            Assert.IsTrue(sched.UnscheduleJob(new TriggerKey("t1")), "Scheduler should have returned 'true' from attempt to unschedule existing trigger. ");

            jobKeys     = sched.GetJobKeys(GroupMatcher <JobKey> .GroupEquals(JobKey.DefaultGroup));
            triggerKeys = sched.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals(TriggerKey.DefaultGroup));

            Assert.AreEqual(1, jobKeys.Count, "Number of jobs expected in default group was 1 "); // job should have been left in place, because it is non-durable
            Assert.AreEqual(0, triggerKeys.Count, "Number of triggers expected in default group was 0 ");

            sched.Shutdown();
        }
예제 #22
0
        public bool Post([FromBody] TaskWidget widget)
        {
            // 判斷 Cron 表达式
            if (string.IsNullOrEmpty(widget.CronExpression))
            {
                return(false);
            }

            // 系統内置任務禁止更改
            // 演示模式下禁止刪除内置任務
            if (DictHelper.RetrieveSystemModel() && _tasks.Any(t => t.Equals(widget.Name, StringComparison.OrdinalIgnoreCase)))
            {
                return(false);
            }

            // 加載任務執行體
            // 此處可以擴展為任意 DLL 中的任意继承 ITask 接口的實體類
            var taskExecutor = LgbActivator.CreateInstance <ITask>("Bootstrap.Admin", widget.TaskExecutorName);

            if (taskExecutor == null)
            {
                return(false);
            }

            // 此處未存储到資料庫中,直接送入任務中心
            TaskServicesManager.Remove(widget.Name);
            TaskServicesManager.GetOrAdd(widget.Name, token => taskExecutor.Execute(token), TriggerBuilder.Build(widget.CronExpression));
            return(true);
        }
예제 #23
0
      private bool ExecuteWebApi(SchedulerConfigModel list)
      {
          try
          {
              var             flag      = true;
              SchedulerHelper scheduler = new SchedulerHelper();

              SchedulerRequest request = new SchedulerRequest();
              request.JobName          = list.JobName;
              request.JobGroup         = list.JobGroup;
              request.TriggerName      = list.JobName + "Trigger";
              request.TriggerGroupName = list.JobGroup + "Trigger";
              request.CronTab          = list.CronTab;
              request.StartTime        = list.StartTime;
              if (list.EndTime != null)
              {
                  request.EndTime = list.EndTime;
              }
              else
              {
                  request.EndTime = null;
              }
              request.RequestType = list.RequestType;
              request.RequestUrl  = list.RequestUrl;

              var json = JsonConvert.SerializeObject(request);

              DateTimeOffset?end = null;
              if (request.EndTime != null)
              {
                  end = DateTime.SpecifyKind(Convert.ToDateTime(request.EndTime), DateTimeKind.Local);
                  if (request.EndTime < DateTime.Now)
                  {
                      flag = false;
                  }
              }
              if (flag)
              {
                  IJobDetail jobDetail = JobBuilder.Create <FileJob>()
                                         .WithIdentity(request.JobName, request.JobGroup)
                                         .UsingJobData("jobJson", json)
                                         .Build();

                  CronTriggerImpl tigger = (CronTriggerImpl)TriggerBuilder.Create()
                                           .WithIdentity(request.TriggerName, request.TriggerGroupName)
                                           .WithCronSchedule(request.CronTab)
                                           .ForJob(request.JobName, request.JobGroup)
                                           .StartNow()
                                           .EndAt(end)
                                           .Build();

                  DateTimeOffset dt = scheduler.scheduleJob(jobDetail, tigger);
              }
              else
              {
              }

              return(true);
          }
          catch (Exception ex)
          {
              //插入日志
              SchedulerRequest request = new SchedulerRequest();
              request.JobGroup    = list.JobGroup;
              request.JobName     = list.JobName;
              request.RequestType = list.RequestType;
              request.RequestUrl  = list.RequestUrl;
              request.ReturnMsg   = "Job-Exception: " + (ex.ToString().Length > 450 ? ex.ToString().Substring(0, 450) : ex.ToString());
              request.LogStatus   = (int)JobEnum.LogStatus.ExceptInfo;
              SchedulerConfigDB.InsertLog(request);
              //数据状态更新为0,防止重复执行
              SchedulerConfigDB.UpdateStatus(list.ID);
              return(false);
          }
      }
예제 #24
0
파일: Program.cs 프로젝트: wgbell/quartznet
        static async Task Main(string[] args)
        {
            try
            {
                Console.WriteLine("------- Initializing -------------------");

                NameValueCollection properties = new NameValueCollection
                {
                    ["quartz.scheduler.instanceName"]  = "RemoteClient",
                    ["quartz.threadPool.type"]         = "Quartz.Simpl.SimpleThreadPool, Quartz",
                    ["quartz.threadPool.threadCount"]  = "5",
                    ["quartz.scheduler.proxy"]         = "true",
                    ["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler"
                };

                // First we must get a reference to a scheduler
                ISchedulerFactory sf    = new StdSchedulerFactory(properties);
                IScheduler        sched = await sf.GetScheduler();

                // First we must get a reference to a scheduler
                //ISchedulerFactory sf = new StdSchedulerFactory();
                //IScheduler sched = await sf.GetScheduler();

                Console.WriteLine("------- Initialization Complete --------");
                sched.Start();

                // define the job and tie it to our HelloJob class
                IJobDetail oojob = JobBuilder.Create <OOTestJob>()
                                   .WithIdentity("oojob1", "oogroup1")
                                   .Build();

                oojob.JobDataMap.Put("OOTestJob1", "Bla Bla");
                oojob.JobDataMap.Put("User", "Gary Bell");
                // Trigger the job to run on the next round minute
                ITrigger trigger = TriggerBuilder.Create()
                                   .WithIdentity("ootrigger1", "oogroup1")
                                   .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Second))
                                   .Build();

                // Tell quartz to schedule the job using our trigger
                await sched.ScheduleJob(oojob, trigger);

                var keys = await sched.GetJobKeys(GroupMatcher <JobKey> .AnyGroup());

                foreach (var key in keys)
                {
                    Console.WriteLine("\t " + key);
                    var sw = new Stopwatch();
                    sw.Start();
                    while (sw.ElapsedMilliseconds < 60000)
                    {
                        var jobs = await sched.GetCurrentlyExecutingJobs();

                        if (jobs.Count > 0)
                        {
                            Console.WriteLine($"---Waiting on {jobs.Count} to finish.");
                            foreach (var job in jobs)
                            {
                                Console.WriteLine($"\tJob Desc: {job.JobDetail.Description}");
                                foreach (var jobdataStr in job.MergedJobDataMap.Keys)
                                {
                                    Console.WriteLine($"\t{jobdataStr} = {job.MergedJobDataMap[jobdataStr]}");
                                }
                            }
                        }
                        else
                        {
                            var groups = await sched.GetJobGroupNames();

                            if (groups.Count > 0)
                            {
                                Console.WriteLine($"There are {groups.Count} scheduled");
                            }
                            else
                            {
                                Console.WriteLine($"***Press a key to exit");
                                break;
                            }
                        }

                        await Task.Delay(1500);
                    }
                }
                Console.Read();
                return;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
예제 #25
0
        private async Task TestMatchers(IScheduler scheduler)
        {
            await scheduler.Clear();

            var job = JobBuilder.Create <NoOpJob>().WithIdentity("job1", "aaabbbccc").StoreDurably().Build();
            await scheduler.AddJob(job, true);

            var schedule = SimpleScheduleBuilder.Create();
            var trigger  =
                TriggerBuilder.Create().WithIdentity("trig1", "aaabbbccc").WithSchedule(schedule).ForJob(job).Build();
            await scheduler.ScheduleJob(trigger);

            job = JobBuilder.Create <NoOpJob>().WithIdentity("job1", "xxxyyyzzz").StoreDurably().Build();
            await scheduler.AddJob(job, true);

            schedule = SimpleScheduleBuilder.Create();
            trigger  =
                TriggerBuilder.Create().WithIdentity("trig1", "xxxyyyzzz").WithSchedule(schedule).ForJob(job).Build();
            await scheduler.ScheduleJob(trigger);

            job = JobBuilder.Create <NoOpJob>().WithIdentity("job2", "xxxyyyzzz").StoreDurably().Build();
            await scheduler.AddJob(job, true);

            schedule = SimpleScheduleBuilder.Create();
            trigger  =
                TriggerBuilder.Create().WithIdentity("trig2", "xxxyyyzzz").WithSchedule(schedule).ForJob(job).Build();
            await scheduler.ScheduleJob(trigger);

            var jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .AnyGroup());

            jkeys.Count.Should().Be(3, "Wrong number of jobs found by anything matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals("xxxyyyzzz"));

            jkeys.Count.Should().Be(2, "Wrong number of jobs found by equals matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEquals("aaabbbccc"));

            jkeys.Count.Should().Be(1, "Wrong number of jobs found by equals matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupStartsWith("aa"));

            jkeys.Count.Should().Be(1, "Wrong number of jobs found by starts with matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupStartsWith("xx"));

            jkeys.Count.Should().Be(2, "Wrong number of jobs found by starts with matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEndsWith("cc"));

            jkeys.Count.Should().Be(1, "Wrong number of jobs found by ends with matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupEndsWith("zzz"));

            jkeys.Count.Should().Be(2, "Wrong number of jobs found by ends with matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupContains("bc"));

            jkeys.Count.Should().Be(1, "Wrong number of jobs found by contains with matcher");

            jkeys = await scheduler.GetJobKeys(GroupMatcher <JobKey> .GroupContains("yz"));

            jkeys.Count.Should().Be(2, "Wrong number of jobs found by contains with matcher");

            var tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .AnyGroup());

            tkeys.Count.Should().Be(3, "Wrong number of triggers found by anything matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals("xxxyyyzzz"));

            tkeys.Count.Should().Be(2, "Wrong number of triggers found by equals matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEquals("aaabbbccc"));

            tkeys.Count.Should().Be(1, "Wrong number of triggers found by equals matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupStartsWith("aa"));

            tkeys.Count.Should().Be(1, "Wrong number of triggers found by starts with matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupStartsWith("xx"));

            tkeys.Count.Should().Be(2, "Wrong number of triggers found by starts with matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEndsWith("cc"));

            tkeys.Count.Should().Be(1, "Wrong number of triggers found by ends with matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupEndsWith("zzz"));

            tkeys.Count.Should().Be(2, "Wrong number of triggers found by ends with matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupContains("bc"));

            tkeys.Count.Should().Be(1, "Wrong number of triggers found by contains with matcher");

            tkeys = await scheduler.GetTriggerKeys(GroupMatcher <TriggerKey> .GroupContains("yz"));

            tkeys.Count.Should().Be(2, "Wrong number of triggers found by contains with matcher");
        }
예제 #26
0
        private static ITrigger CreateTrigger(string key)
        {
            const int localTimeZone = -4;

            switch (key.ToUpper())
            {
            case "A CADA 1 SEGUNDO":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 1 Segundo")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInSeconds(1)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 5 SEGUNDOS":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 5 Segundos")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInSeconds(5)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 10 SEGUNDOS":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 10 Segundos")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInSeconds(10)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 15 SEGUNDOS":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 15 Segundos")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInSeconds(15)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 60 SEGUNDOS":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 60 Segundos")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInSeconds(60)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 10 MINUTOS":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 10 Minutos")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInMinutes(10)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "A CADA 1 HORA":
                return(TriggerBuilder.Create()
                       .WithDescription("A cada 1 Hora")
                       .WithSimpleSchedule(x => x
                                           .WithIntervalInHours(1)
                                           .RepeatForever()
                                           .WithMisfireHandlingInstructionNowWithExistingCount())
                       .Build());

            case "TODO DIA AS 5AM (UTC-4)":
                return(TriggerBuilder.Create()
                       .WithDescription("Todo dia as 5AM (UTC-4)")
                       .WithDailyTimeIntervalSchedule(x => x.
                                                      WithIntervalInHours(24)
                                                      .OnEveryDay()
                                                      .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(5 - localTimeZone, 0))
                                                      .InTimeZone(TimeZoneInfo.Utc))
                       .Build());

            case "TODO DIA AS 6AM (UTC-4)":
                return(TriggerBuilder.Create()
                       .WithDescription("Todo dia as 6AM (UTC-4)")
                       .WithDailyTimeIntervalSchedule(x => x.
                                                      WithIntervalInHours(24)
                                                      .OnEveryDay()
                                                      .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(6 - localTimeZone, 0))
                                                      .InTimeZone(TimeZoneInfo.Utc))
                       .Build());

            case "A CADA 6H COMEÇANDO AS 5":
                return(TriggerBuilder.Create()
                       .WithDescription("Todo dia as 6AM (UTC-4)")
                       .WithDailyTimeIntervalSchedule(x => x.
                                                      WithIntervalInHours(24)
                                                      .OnEveryDay()
                                                      .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(5 - localTimeZone, 0))
                                                      .InTimeZone(TimeZoneInfo.Utc))
                       .Build());

            default:
                throw new Exception("Trigger not implemented:\"" + key + "\"");
            }
        }
예제 #27
0
        /// <summary>
        /// 添加简单重复执行任务
        /// </summary>
        /// <param name="jobName">任务名称</param>
        /// <param name="starTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="keyValue">任务主键</param>
        /// <param name="value">间隔值</param>
        /// <param name="type">间隔类型</param>
        public static void AddRepeatJob(string jobName, string starTime, string endTime, string keyValue, int value, string type)
        {
            try
            {
                IScheduler sched = schedFact.GetScheduler();            //得到一个调度程序

                IJobDetail job = JobBuilder.Create <SchedulingHelper>() //新建任务执行类
                                 .WithIdentity(jobName, "lrts")         // name "myJob", group "group1"
                                 .UsingJobData("keyValue", keyValue)    //传递参数
                                 .Build();
                ///开始时间处理
                DateTime StarTime = DateTime.Now;
                if (!string.IsNullOrEmpty(starTime))
                {
                    StarTime = Convert.ToDateTime(starTime);
                }
                DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
                ///结束时间处理
                DateTime EndTime = DateTime.MaxValue.AddDays(-1);
                if (!string.IsNullOrEmpty(endTime))
                {
                    EndTime = Convert.ToDateTime(endTime);
                }
                DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
                ITrigger       trigger    = null;

                switch (type)
                {
                case "minute":     // 分钟
                    trigger = TriggerBuilder.Create().WithIdentity(jobName, "lrts")
                              .StartAt(starRunTime)
                              .EndAt(endRunTime)
                              .WithSimpleSchedule(t =>
                                                  t.WithIntervalInMinutes(value)
                                                  .RepeatForever())
                              .Build();
                    break;

                case "hours":     // 小时
                    trigger = TriggerBuilder.Create()
                              .WithIdentity(jobName, "lrts")
                              .StartAt(starRunTime)
                              .EndAt(endRunTime)
                              .WithSimpleSchedule(t =>
                                                  t.WithIntervalInHours(value)
                                                  .RepeatForever())
                              .Build();
                    break;

                case "day":     // 天
                    trigger = TriggerBuilder.Create()
                              .WithIdentity(jobName, "lrts")
                              .StartAt(starRunTime)
                              .EndAt(endRunTime)
                              .WithSchedule(
                        CalendarIntervalScheduleBuilder.Create()
                        .WithIntervalInDays(value)
                        )
                              .Build();
                    break;

                case "week":    // 周
                    trigger = TriggerBuilder.Create()
                              .WithIdentity(jobName, "lrts")
                              .StartAt(starRunTime)
                              .EndAt(endRunTime)
                              .WithSchedule(
                        CalendarIntervalScheduleBuilder.Create()
                        .WithIntervalInWeeks(value)
                        )
                              .Build();
                    break;
                }
                //实例化
                sched.ScheduleJob(job, trigger);
                //启动
                if (!sched.IsStarted)
                {
                    sched.Start();
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
예제 #28
0
        public async Task Run(ILog log)
        {
            log.Info("------- Initializing -------------------");

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory();
            IScheduler        sched = sf.GetScheduler();

            log.Info("------- Initialization Complete -----------");

            log.Info("------- Scheduling Jobs -----------");

            // jobs can be scheduled before start() has been called

            // get a "nice round" time a few seconds in the future...

            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 15);

            // statefulJob1 will run every three seconds
            // (but it will delay for ten seconds)
            IJobDetail job = JobBuilder.Create <StatefulDumbJob>()
                             .WithIdentity("statefulJob1", "group1")
                             .UsingJobData(StatefulDumbJob.ExecutionDelay, 10000L)
                             .Build();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("trigger1", "group1")
                                     .StartAt(startTime)
                                     .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
                                     .Build();

            DateTimeOffset ft = sched.ScheduleJob(job, trigger);

            log.Info($"{job.Key} will run at: {ft.ToString("r")} and repeat: {trigger.RepeatCount} times, every {trigger.RepeatInterval.TotalSeconds} seconds");

            // statefulJob2 will run every three seconds
            // (but it will delay for ten seconds - and therefore purposely misfire after a few iterations)
            job = JobBuilder.Create <StatefulDumbJob>()
                  .WithIdentity("statefulJob2", "group1")
                  .UsingJobData(StatefulDumbJob.ExecutionDelay, 10000L)
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger2", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x
                                          .WithIntervalInSeconds(3)
                                          .RepeatForever()
                                          .WithMisfireHandlingInstructionIgnoreMisfires()) // set misfire instructions
                      .Build();
            ft = sched.ScheduleJob(job, trigger);

            log.Info($"{job.Key} will run at: {ft.ToString("r")} and repeat: {trigger.RepeatCount} times, every {trigger.RepeatInterval.TotalSeconds} seconds");

            // MisfireJob will run every three seconds
            // (but it will delay for ten seconds - and therefore purposely misfire after a few iterations)
            job = JobBuilder.Create <MisfireJob>()
                  .WithIdentity("MisfireJob", "group1")
                  .UsingJobData(MisfireJob.ExecutionDelay, 30L)
                  .Build();

            trigger = (ISimpleTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger3", "group1")
                      .StartAt(startTime)
                      .WithSimpleSchedule(x => x
                                          .WithIntervalInSeconds(3)
                                          .RepeatForever()
                                          .WithMisfireHandlingInstructionNowWithExistingCount()) // set misfire instructions
                      .Build();
            ft = sched.ScheduleJob(job, trigger);

            log.Info($"{job.Key} will run at: {ft.ToString("r")} and repeat: {trigger.RepeatCount} times, every {trigger.RepeatInterval.TotalSeconds} seconds");


            log.Info("------- Starting Scheduler ----------------");

            // jobs don't start firing until start() has been called...
            sched.Start();

            log.Info("------- Started Scheduler -----------------");

            // sleep for ten minutes for triggers to file....
            await Task.Delay(TimeSpan.FromMinutes(10));

            log.Info("------- Shutting Down ---------------------");

            sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");

            SchedulerMetaData metaData = sched.GetMetaData();

            log.Info($"Executed {metaData.NumberOfJobsExecuted} jobs.");
        }
        public static void Start()
        {
            #region Scheduler Envia Email Sms

            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            IJobDetail jobEmailSms = JobBuilder.Create <EnvioEmailSms>().Build();

            ITrigger triggerEmailSms = TriggerBuilder.Create()
                                       .WithIdentity("trigger1", "group1")
                                       .StartNow()
                                       .WithSimpleSchedule(x => x
                                                           .WithIntervalInSeconds(120) // Chama serviço para enviar Email e Sms de 2 em 2 minutos.
                                                           .RepeatForever())
                                       .Build();

            scheduler.ScheduleJob(jobEmailSms, triggerEmailSms);

            #endregion


            #region Scheduler Gera Cotação

            IScheduler schedulerGeraCotacao = StdSchedulerFactory.GetDefaultScheduler();
            schedulerGeraCotacao.Start();

            IJobDetail jobGeraCotacao = JobBuilder.Create <GeraCotacao>().Build();

            ITrigger triggerGeraCotacao = TriggerBuilder.Create()
                                          .WithIdentity("trigger2", "group2")
                                          .StartNow()
                                          .WithCronSchedule("0 00 12 * * ?") // Ás 12:00:00 é gerado cotação caso exista pedidos
                                          .Build();

            schedulerGeraCotacao.ScheduleJob(jobGeraCotacao, triggerGeraCotacao);

            #endregion


            #region Scheduler Fechar Cotação

            IScheduler schedulerFecharCotacao = StdSchedulerFactory.GetDefaultScheduler();
            schedulerFecharCotacao.Start();

            IJobDetail jobFecharCotacao = JobBuilder.Create <FecharCotacao>().Build();

            ITrigger triggerFecharCotacao = TriggerBuilder.Create()
                                            .WithIdentity("trigger3", "group3")
                                            .StartNow()
                                            .WithSimpleSchedule(x => x
                                                                .WithIntervalInSeconds(2) // Chama serviço para fechar cotação de 2 em 2 minutos.
                                                                .RepeatForever())
                                            .Build();

            schedulerFecharCotacao.ScheduleJob(jobFecharCotacao, triggerFecharCotacao);

            #endregion


            #region Scheduler Notificacoes e Alertas

            IScheduler schedulerNotificacoesAlertas = StdSchedulerFactory.GetDefaultScheduler();
            schedulerNotificacoesAlertas.Start();

            IJobDetail jobNotificacoesAlertas = JobBuilder.Create <NotificacoesAlertas>().Build();

            ITrigger triggerNotificacoesAlertas = TriggerBuilder.Create()
                                                  .WithIdentity("trigger4", "group4")
                                                  .StartNow()
                                                  .WithSimpleSchedule(x => x
                                                                      .WithIntervalInSeconds(2) // Chama serviço para enviar notificações e alertas de 2 em 2 minutos.
                                                                      .RepeatForever())
                                                  .Build();

            schedulerNotificacoesAlertas.ScheduleJob(jobNotificacoesAlertas, triggerNotificacoesAlertas);

            #endregion


            #region Scheduler Pagamentos / Gera Fatura Fornecedores

            IScheduler schedulerPagamentosFatura = StdSchedulerFactory.GetDefaultScheduler();
            schedulerPagamentosFatura.Start();

            IJobDetail jobPagamentosFatura = JobBuilder.Create <GeraFatura>().Build();

            ITrigger triggerPagamentosFatura = TriggerBuilder.Create()
                                               .WithIdentity("trigger5", "group5")
                                               .StartNow()
                                               .WithCronSchedule("0 00 01 * * ?") // Ás 00:01:00 são gerados boletos
                                               .Build();

            schedulerPagamentosFatura.ScheduleJob(jobPagamentosFatura, triggerPagamentosFatura);

            #endregion


            #region Scheduler Pagamentos / Gera Mensalidade Membros

            IScheduler schedulerPagamentosMensalidade = StdSchedulerFactory.GetDefaultScheduler();
            schedulerPagamentosMensalidade.Start();

            IJobDetail jobPagamentosMensalidade = JobBuilder.Create <GeraMensalidade>().Build();

            ITrigger triggerPagamentosMensalidade = TriggerBuilder.Create()
                                                    .WithIdentity("trigger6", "group6")
                                                    .StartNow()
                                                    .WithCronSchedule("0 00 01 * * ?") // Ás 00:01:00 são geradas mensalidades
                                                    .Build();

            schedulerPagamentosMensalidade.ScheduleJob(jobPagamentosMensalidade, triggerPagamentosMensalidade);

            #endregion
        }
예제 #30
0
        public virtual void Run()
        {
            ILog log = LogManager.GetLogger(typeof(CronTriggerExample));

            log.Info("------- Initializing -------------------");

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory();
            IScheduler        sched = sf.GetScheduler();

            log.Info("------- Initialization Complete --------");

            log.Info("------- Scheduling Jobs ----------------");

            // jobs can be scheduled before sched.start() has been called

            // job 1 will run every 20 seconds

            IJobDetail job = JobBuilder.NewJob <SimpleJob>()
                             .WithIdentity("job1", "group1")
                             .Build();

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                   .WithIdentity("trigger1", "group1")
                                   .WithSchedule(CronScheduleBuilder.CronSchedule("0/20 * * * * ?"))
                                   .Build();

            DateTimeOffset ft = sched.ScheduleJob(job, trigger);

            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 2 will run every other minute (at 15 seconds past the minute)
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job2", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger2", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("15 0/2 * * * ?"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 3 will run every other minute but only between 8am and 5pm
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job3", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger3", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("0 0/2 8-17 * * ?"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 4 will run every three minutes but only between 5pm and 11pm
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job4", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger4", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("0 0/3 17-23 * * ?"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 5 will run at 10am on the 1st and 15th days of the month
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job5", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger5", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("0 0 10am 1,15 * ?"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 6 will run every 30 seconds but only on Weekdays (Monday through Friday)
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job6", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger6", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("0,30 * * ? * MON-FRI"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            // job 7 will run every 30 seconds but only on Weekends (Saturday and Sunday)
            job = JobBuilder.NewJob <SimpleJob>()
                  .WithIdentity("job7", "group1")
                  .Build();

            trigger = (ICronTrigger)TriggerBuilder.Create()
                      .WithIdentity("trigger7", "group1")
                      .WithSchedule(CronScheduleBuilder.CronSchedule("0,30 * * ? * SAT,SUN"))
                      .Build();

            ft = sched.ScheduleJob(job, trigger);
            log.Info(job.Key + " has been scheduled to run at: " + ft
                     + " and repeat based on expression: "
                     + trigger.CronExpressionString);

            log.Info("------- Starting Scheduler ----------------");

            // All of the jobs have been added to the scheduler, but none of the
            // jobs
            // will run until the scheduler has been started
            sched.Start();

            log.Info("------- Started Scheduler -----------------");

            log.Info("------- Waiting five minutes... ------------");
            try
            {
                // wait five minutes to show jobs
                Thread.Sleep(300 * 1000);
                // executing...
            }
            catch (ThreadInterruptedException)
            {
            }

            log.Info("------- Shutting Down ---------------------");

            sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");

            SchedulerMetaData metaData = sched.GetMetaData();

            log.Info(string.Format("Executed {0} jobs.", metaData.NumberOfJobsExecuted));
        }
 /// <summary>
 /// Adds a trigger that executes at logon of a specific user.
 /// </summary>
 /// <param name="userId">The user id.</param>
 /// <returns><see cref="TriggerBuilder" /> instance.</returns>
 public TriggerBuilder AtLogonOf(string userId)
 {
     var b = new TriggerBuilder(tb, TaskTriggerType.Logon);
     ((LogonTrigger)b.trigger).UserId = userId;
     return b;
 }
 private static ITrigger BuildCronConfiguredTrigger(string jobUid, string subscriptionName, JobSchedule schedule)
 => TriggerBuilder.Create()
 .WithIdentity(jobUid, subscriptionName)
 .WithCronSchedule(schedule.CronOverride)
 .Build();
 internal MonthlyDOWTriggerBuilder(BuilderInfo taskBuilder, DaysOfTheWeek dow)
     : base(taskBuilder)
 {
     this.trb = new TriggerBuilder(taskBuilder, dow);
 }
예제 #34
0
        /// <summary>
        /// Register User Internal
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal async Task <RegisterUserResult> RegisterInternal(RegisterGeneralModel model)
        {
            var userResult = new RegisterUserResult();

            using (IUnitOfWork unitOfWork = UnitOfWork.Create())
            {
                var checkUserEmail = unitOfWork.UserRepository.GetAll().FirstOrDefault(a => a.Email == model.Email || a.UserName == model.Email);

                if (checkUserEmail != null)
                {
                    userResult.AddError(HttpStatusCode.BadRequest, 10, "This email is already taken ***");
                    return(userResult);
                }

                unitOfWork.BeginTransaction();

                //Create user record
                var user = new ApplicationUser
                {
                    Id        = Guid.NewGuid().ToString(),
                    FirstName = model.FirstName ?? string.Empty,
                    LastName  = model.LastName ?? string.Empty,
                    UserName  = model.Email,
                    Email     = model.Email,
                    //AvatarFileId = model.AvatarFileId,
                    HasTempPassword = true,
                    CreatedById     = DbConstants.AdminUserId,
                    CreatedDate     = DateTime.Now
                };

                if (!string.IsNullOrEmpty(model.UserName))
                {
                    var names = model.UserName.Split(' ');

                    user.FirstName = names[0];
                    user.LastName  = names.Length > 1 ? names[1] : "";
                }

                if (!string.IsNullOrEmpty(model.Password))
                {
                    user.PasswordHash = new PasswordHasher().HashPassword(model.Password);
                }

                user.AutopilotTrack = true;
                user.SecurityStamp  = Guid.NewGuid().ToString();


                #region Need To redo
                {
                    ISchedulerFactory factory   = new StdSchedulerFactory();
                    IScheduler        scheduler = factory.GetScheduler();
                    JobDataMap        dataMap   = new JobDataMap();

                    dataMap["registermodel"] = model;
                    dataMap["userId"]        = user.Id;
                    dataMap["OperationType"] = "Registration";

                    var job = JobBuilder.Create <UpdateContactJob>()
                              .WithIdentity("UpdateContactJob").UsingJobData(dataMap)
                              .Build();

                    var jobKey = new JobKey("UpdateContactJob");

                    ITrigger trigger = TriggerBuilder.Create()
                                       .WithIdentity("trigger1")
                                       .StartAt(DateTime.Now)
                                       .ForJob(jobKey)
                                       .Build();

                    if (!scheduler.CheckExists(jobKey))
                    {
                        scheduler.ScheduleJob(job, trigger);
                    }

                    scheduler.Start();
                }
                #endregion


                unitOfWork.UserRepository.Insert(user);
                await unitOfWork.SaveAsync();

                ApplicationUserRole userRole = new ApplicationUserRole();
                userRole.RoleId = DataLayer.DbConstants.CustomerUserRole;
                userRole.UserId = user.Id;
                unitOfWork.UserRoleRepository.Insert(userRole);

                await unitOfWork.SaveAsync();

                Address address = new Address();
                address.CreatedById = user.Id;
                address.CreatedDate = DateTime.Now;

                unitOfWork.AddressRepository.Insert(address);
                await unitOfWork.SaveAsync();

                CustomerDetails customer = new CustomerDetails();
                customer.Id           = Guid.NewGuid();
                customer.CreatedById  = user.Id;
                customer.CreatedDate  = DateTime.Now;
                customer.UserId       = user.Id;
                customer.ContactPhone = model.ContactPhone;
                customer.AddressId    = address.Id;

                customer.ModifiedReason = "created";
                unitOfWork.CustomerDetailsRepository.Insert(customer);

                await unitOfWork.SaveAsync();

                if (!string.IsNullOrEmpty(model.Provider) && !string.IsNullOrEmpty(model.ExternalAccessToken))
                {
                    var loginInfo = await this.SignInManager.AuthenticationManager.GetExternalLoginInfoAsync();

                    ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(loginInfo.ExternalIdentity as ClaimsIdentity);

                    ApplicationUserLogin userLogin = new ApplicationUserLogin();
                    userLogin.UserId        = user.Id;
                    userLogin.ProviderKey   = loginInfo.Login.ProviderKey;
                    userLogin.LoginProvider = loginInfo.Login.LoginProvider;

                    unitOfWork.UserLoginRepository.Insert(userLogin);

                    await unitOfWork.SaveAsync();
                }

                unitOfWork.CommitTransaction();

                if (model.Provider == null)
                {
                    //Senf verification Email
                    {
                        string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

                        var callbackUrl = string.Format("{0}/#/confirm-email?userId={1}&code={2}", Url.Link("Default", new { controller = "account" }), user.Id, Uri.EscapeDataString(code));
                        await EmailNitificationHelper.Create().SendConfirmationEmail(user, UserManager, callbackUrl);
                    }
                }

                userResult.UserId = user.Id;

                return(userResult);
            }
        }