/// <summary>
        /// Executes the specified working item on the scheduling engine.
        /// </summary>
        /// <param name="engine">The scheduling engine.</param>
        /// <param name="item">The scheduled item.</param>
        public void Execute(ISchedulerEngine engine, IWorkingItem item)
        {
            int workerThreads;
            int iocpThreads;

            ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);

            if (workerThreads <= _warningThreshold)
            {
                _log.Warn("Number of free threads in threadpool is low. Next async tasks will be only queued!");
            }

            // new task based threading
            Task.Factory.StartNew(
                () =>
            {
                try
                {
                    item.Execute(engine);
                }
                catch (Exception e)
                {
                    // last resort exception handler
                    _log.Error($"Unhandled exception in work item async processing {e.Message}");
                }
            },
                TaskCreationOptions.PreferFairness);
        }
Esempio n. 2
0
 /// <summary>
 /// Executes the item.
 /// </summary>
 /// <param name="engine">The engine.</param>
 protected virtual void ExecuteItem(ISchedulerEngine engine)
 {
     if (_suspendCount == 0)
     {
         _task(); // simply run the configured task
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Processes the pending work items.
        /// </summary>
        /// <param name="engine">The scheduler engine we're working under.</param>
        /// <returns>
        /// A minimal timespan that we should wait for next execution round (unless new item is scheduled).
        /// </returns>
        public TimeSpan ProcessPendingWorkItems(ISchedulerEngine engine)
        {
            ////_log.Trace("Processing scheduled items");

            // get the current available items, replace the pending items with empty list
            IEnumerable <IWorkingItem> items;

            lock (_appendLock)
            {
                items      = _workItems;
                _workItems = new List <IWorkingItem>();
            }

            DateTime now = Time.UtcNow;

            List <IWorkingItem> pendingItems  = new List <IWorkingItem>();
            DateTime            closestItem   = DateTime.MaxValue;
            TimeSpan            nextExecution = -1.ms(); // define infinite timeout

            foreach (var item in items)
            {
                DateTime executionTime = item.ExecutionTime;

                if (executionTime == DateTime.MinValue)
                {
                    continue; // this one was aborted, just ignore it
                }
                if (executionTime <= now)
                {
                    ////_log.Trace(
                    ////    "Executing scheduled item {0}. Planned to: {1}",
                    ////    item.ToString(),
                    ////    executionTime.ToString("dd.MM.yyyy HH:mm:ss.ffff"));

                    _executor.Execute(engine, item);
                }
                else
                {
                    pendingItems.Add(item); // item is scheduled in future
                    closestItem   = new DateTime(Math.Min(executionTime.Ticks, closestItem.Ticks));
                    nextExecution = closestItem - now;
                }
            }

            if (pendingItems.Count != 0)
            {
                Schedule(pendingItems); // re-schedule the still pending items
            }

            // recalculate the waiting timeout
            ////_log.Trace("Next round scheduled after {0}, (pending: {1})", nextExecution, pendingItems.Count);

            return(nextExecution); // closestItem ought to be in future
        }
Esempio n. 4
0
        /// <summary>
        /// Executes the specified task immediatelly.
        /// </summary>
        /// <param name="engine">The scheduling engine.</param>
        public void Execute(ISchedulerEngine engine)
        {
            lock (InstanceLock)
            {
                // check if the task is being aborted
                if (ExecutionTime == DateTime.MinValue)
                {
                    return; // simply return - this will cause the task to be removed from the scheduler
                }
            }

            ExecuteItem(engine);
        }
Esempio n. 5
0
        /// <summary>
        /// 创建调度器
        /// </summary>
        /// <param name="engine">engine</param>
        /// <returns>myScheduler</returns>
        public object CreateScheduler(ISchedulerEngine engine)
        {
            NameValueCollection properties = new NameValueCollection();

            properties["quartz.scheduler.instanceName"] = "RemoteClient";

            // 设置线程池
            properties["quartz.threadPool.type"]           = "Quartz.Simpl.SimpleThreadPool, Quartz";
            properties["quartz.threadPool.threadCount"]    = "5";
            properties["quartz.threadPool.threadPriority"] = "Normal";

            // 设置远程连接
            properties["quartz.scheduler.proxy"]         = "true";
            properties["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:11111/QuartzScheduler";
            IScheduler myScheduler = new StdSchedulerFactory(properties).GetScheduler();

            return(myScheduler);
        }
        /// <summary>
        /// Executes the specified task immediatelly.
        /// </summary>
        /// <param name="engine">The scheduling engine.</param>
        protected override void ExecuteItem(ISchedulerEngine engine)
        {
            lock (InstanceLock)
            {
                // if some repeat-for was specified, calculate new until time
                if (_repeatFor != TimeSpan.MinValue)
                {
                    _repeatUntil = Time.UtcNow + _repeatFor;
                    _repeatFor   = TimeSpan.MinValue;
                }
            }

            // execute the task itself
            base.ExecuteItem(engine);

            lock (InstanceLock)
            {
                var now = Time.UtcNow;

                // reschedule the task, when needed (and when the task was not aborted)
                if ((_repeatPeriod != TimeSpan.MinValue) && (ExecutionTime != DateTime.MinValue))
                {
                    // calculate the new execution time
                    while (ExecutionTime <= now)
                    {
                        ExecutionTime = CalculateNextExecutionTime(_repeatPeriod);
                    }

                    // when the task is not recurring, reset the repeat period
                    if (_recurring == false)
                    {
                        _repeatPeriod = TimeSpan.MinValue;
                    }

                    // when the until time is not specified or is less than now, reschedule
                    if (_repeatUntil == DateTime.MinValue || ExecutionTime <= _repeatUntil)
                    {
                        engine.Schedule(this); // reschedule self
                    }
                }
            }
        }
        public object CreateScheduler(ISchedulerEngine engine)
        {
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

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

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

            scheduler.ScheduleJob(jobDetail, trigger);

            return(scheduler);
        }
        public object CreateScheduler(ISchedulerEngine engine)
        {
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            var scheduler = GetScheduler(schedulerFactory.GetScheduler());

            // Put jobs creation code here

            /*
             *
             * var jobDetail = JobBuilder.Create<HelloJob>()
             * .StoreDurably()
             * .WithIdentity("myJob")
             * .Build();
             *
             * var trigger = TriggerBuilder.Create()
             * .WithIdentity("myTrigger")
             * .StartNow()
             * .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever())
             * .Build();
             *
             * scheduler.ScheduleJob(jobDetail, trigger); */

            return(scheduler);
        }
Esempio n. 9
0
 public SchedulerManagerService(ISchedulerEngine scheduler)
 {
     _scheduler = scheduler;
 }
Esempio n. 10
0
 public object CreateScheduler(ISchedulerEngine engine)
 {
     return(engine.CreateStandardRemoteScheduler(SchedulerHost));
 }
 public object CreateScheduler(ISchedulerEngine engine)
 {
     return(_factory.Invoke());
 }
Esempio n. 12
0
        public object CreateScheduler(ISchedulerEngine engine)
        {
            NameValueCollection properties = new NameValueCollection();

            properties.Add("test1", "test1value");
            properties.Add("quartz.scheduler.instanceName", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque iaculis et nibh id ornare. Proin vitae sem nulla. Nulla facilisi. Aenean consequat tellus nulla, ac accumsan mi dictum at. Cras scelerisque imperdiet finibus. Praesent aliquet magna justo, eu lacinia felis vehicula eget. In magna felis, congue ac mi et, rhoncus scelerisque odio.");
            properties.Add("quartz.scheduler.instanceId", "test|pipe");

            ISchedulerFactory schedulerFactory = new StdSchedulerFactory(properties);
            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())
                          .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))
                           .Build();

            scheduler.ScheduleJob(jobDetail2, trigger2);

            var trigger3 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger3")
                           .ForJob(jobDetail2)
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInSeconds(40).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 { FisrtName = "John", LastName = "Smith" });
            jobDetail4.JobDataMap.Add("key6", new[]
            {
                new { Name = "test1" },
                new { Name = "test2" }
            });

            // 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);
        }
Esempio n. 13
0
 public object CreateScheduler(ISchedulerEngine engine)
 {
     return(engine.CreateStdScheduler());
 }
Esempio n. 14
0
 public ProgramStarter(ISchedulerEngine engine)
 {
     _engine = engine;
 }
Esempio n. 15
0
        /// <summary>
        /// 创建调度器
        /// </summary>
        /// <param name="engine"></param>
        /// <returns></returns>
        public object CreateScheduler(ISchedulerEngine engine)
        {
            //配置
            NameValueCollection properties = new NameValueCollection();

            properties.Add("test1", "test1value");
            properties.Add("quartz.scheduler.instanceName", "xxxue 的quartz");
            properties.Add("quartz.scheduler.instanceId", "test|pipe");

            //实例化 调度器
            var scheduler = new StdSchedulerFactory(properties)?.GetScheduler();

            /*
             * 添加job与触发器的几种格式
             */

            #region job1

            // 构造 job
            var jobDetail = JobBuilder.Create <HelloJob>()
                            .WithIdentity("myJob") //job 唯一名称
                            .StoreDurably()        //持久储存
                            .Build();

            // 间隔1分钟执行
            var trigger = TriggerBuilder.Create()
                          .WithIdentity("myTrigger")                                           //触发器 唯一名称
                          .StartNow()                                                          //立即开始
                          .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever()) //简单调度: 间隔一分钟 (RepeatForever 重复 永远 :指定触发器将无限期重复。)
                          .Build();                                                            //创建这个触发器

            scheduler.ScheduleJob(jobDetail, trigger);                                         //放入 job与触发器

            #endregion job1

            #region job2

            // 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();

            scheduler.ScheduleJob(jobDetail2, trigger2);

            var trigger3 = TriggerBuilder.Create()
                           .WithIdentity("myTrigger3")
                           .ForJob(jobDetail2) //指定 对应的 job
                           .StartNow()
                           .WithSimpleSchedule(x => x.WithIntervalInSeconds(40).RepeatForever())
                           //.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                           .Build();

            scheduler.ScheduleJob(trigger3);

            #endregion job2

            #region job4

            // 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 { FisrtName = "John", LastName = "Smith" });
            jobDetail4.JobDataMap.Add("key6", new[]
            {
                new { Name = "test1" },
                new { Name = "test2" }
            });

            // 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 * * * ?") //Cron 调度
                                .Build();

            // job , 触发器, 存在相同的是否 替换 如果已存在  并且 Replact = false  则 抛出异常
            scheduler.ScheduleJob(jobDetail4, new HashSet <ITrigger>(new[] { trigger4, trigger5 }), false);
            //scheduler.ScheduleJob(jobDetail4, trigger5);

            #endregion job4

            //暂停 job
            scheduler.PauseJob(new JobKey("myJob4", "MyOwnGroup"));
            //暂停 触发器
            scheduler.PauseTrigger(new TriggerKey("myTrigger3", "DEFAULT"));

            //调度器开始
            scheduler.Start();

            return(scheduler);
        }