Exemplo n.º 1
0
        protected override void OnStart(string[] args)
        {
            logger.Debug("Starting up service.");

            queueFactory = CreateMessageFactory(logger);
            if (!queueFactory.IsActive)
            {
                logger.InfoFormat("RabbitMQ is not active. Messaging will not be available.");
            }

            queuePublisher = new MiramarPublisher(queueFactory);

            var directory = AppDomain.CurrentDomain.BaseDirectory;
            var path      = Path.Combine(directory, "miramar.config");

            var contextProvider  = new MiramarContextProvider();
            var taskProvider     = MiramarConfigurationParser.ParseConfiguration(queuePublisher, path);
            var scheduleProvider = MiramarSchedulingParser.ParseSchedule(queuePublisher, path);

            serviceTask = new Task(() =>
            {
                logger.Info("Starting Miramar Controller.");

                var controller = new MiramarController(queuePublisher, taskProvider, scheduleProvider, contextProvider);
                controller.ThreadRun(serviceSource.Token);
            });
            serviceTask.ContinueWith(x => logger.Info("Controller is shutting down."));

            messageTask = new Task(() =>
            {
                logger.Info("Starting Miramar Scheduler.");

                var scheduler = new ScheduleService(queueFactory, taskProvider, scheduleProvider, contextProvider);
                scheduler.ThreadRun(serviceSource.Token);
            });
            messageTask.ContinueWith(x => logger.Info("Scheduler is shutting down."));

            AddMiramarAdapter(queueFactory);

            serviceTask.Start();
            messageTask.Start();

            logger.Info("Miramar Controller is now running.");
        }
Exemplo n.º 2
0
        public void ThreadRun(CancellationToken token)
        {
            if (taskProvider == null)
            {
                taskProvider = MiramarConfigurationParser.ParseConfiguration("miramar.config");
            }

            if (scheduleProvider == null)
            {
                scheduleProvider = MiramarSchedulingParser.ParseSchedule("miramar.config");
            }

            if (contextProvider == null)
            {
                contextProvider = new MiramarContextProvider();
            }

            taskProvider.PublishConfiguration();
            scheduleProvider.PublishSchedules();

            using (var manual = new ManualResetEventSlim())
            {
                while (true)
                {
                    if (token.IsCancellationRequested)
                    {
                        break;
                    }

                    publisher.PublishHeartbeat(DateTime.Now);

                    var identifiers = scheduleProvider.IdentifyTasksToExecute(DateTime.Now);
                    logger.TraceFormat("Identified {0} tasks that should be ran.", identifiers.Length);

                    foreach (var identifier in identifiers)
                    {
                        logger.TraceFormat("Identified \"{0}\" should be ran.", identifier);

                        ActiveTaskContext context;
                        if (contextProvider.TryGetValue(identifier, out context) && context.IsRunning)
                        {
                            logger.WarnFormat("Task \"{0}\" has been scheduled to run but is currently active.",
                                              identifier);

                            logger.InfoFormat("Task \"{0}\" has been active since {1:yyyy-MM-dd hh:mm:ss}.",
                                              context.TaskName, context.StartDate);

                            continue;
                        }

                        ExecuteTask(identifier, token);
                    }

                    try
                    {
                        manual.Wait(TimeSpan.FromSeconds(15), token);
                    }
                    catch (OperationCanceledException)
                    {
                        break;
                    }
                }
            }

            var runningTasks = contextProvider
                               .GetRunningContexts()
                               .Select(x => x.RunningTask)
                               .ToArray();

            if (contextProvider.Any())
            {
                WaitOnTasks(runningTasks);
            }
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            ObjectFactory.Initialize(x =>
            {
                x.For <IScheduleMessageHandler>()
                .AddInstances(i =>
                {
                    i.Type <HandlerAddSchedule>();
                    i.Type <HandlerChangeLogging>();
                    i.Type <HandlerChangeSchedule>();
                    i.Type <HandlerPublishConfiguration>();
                    i.Type <HandlerPublishSchedule>();
                    i.Type <HandlerRemoveSchedule>();
                    i.Type <HandlerResumeSchedule>();
                    i.Type <HandlerStopTask>();
                });

                x.Scan(s =>
                {
                    s.AssembliesFromApplicationBaseDirectory();
                    s.AddAllTypesOf <IMiramarTaskFactory>();
                });
            });

            var logger = InfrastructureFactory.CreateLogger("Console");

            logger.Debug("Starting up console application.");

            if (args.Length != 0)
            {
                logger.Info("Waiting on debugger attach. Press any key to continue.");
                Console.ReadKey();
            }

            var messageFactory = CreateMessageFactory(logger);

            if (!messageFactory.IsActive)
            {
                logger.InfoFormat("RabbitMQ is not active. Messaging will not be available.");
            }

            var source           = new CancellationTokenSource();
            var publisher        = new MiramarPublisher(messageFactory);
            var contextProvider  = new MiramarContextProvider();
            var taskProvider     = MiramarConfigurationParser.ParseConfiguration(publisher, "miramar.config");
            var scheduleProvider = MiramarSchedulingParser.ParseSchedule(publisher, "miramar.config");

            var controllerTask = new Task(() =>
            {
                logger.Info("Starting Miramar Controller.");

                var controller = new MiramarController(publisher, taskProvider, scheduleProvider, contextProvider, true);
                controller.ThreadRun(source.Token);
            });

            controllerTask.ContinueWith(x => logger.Info("Console application is shutting down."));

            var schedulerTask = new Task(() =>
            {
                logger.Info("Starting Miramar Scheduler.");

                var scheduler = new ScheduleService(messageFactory, taskProvider, scheduleProvider, contextProvider);
                scheduler.ThreadRun(source.Token);
            });

            schedulerTask.ContinueWith(x => logger.Info("Scheduler application is shutting down."));

            AddMiramarAdapter(messageFactory);

            controllerTask.Start();
            schedulerTask.Start();

            logger.Info("Miramar Controller is now running.");
            logger.Info("Miramar Scheduler is now running");
            logger.Info("Press CTRL+C or 'Q' to stop.");

            Console.CancelKeyPress += (s, e) =>
            {
                logger.Warn("CTRL+C detected. Attempting to quit.");
                CancelAndWait(source, messageFactory,
                              controllerTask, schedulerTask);
            };

            while (true)
            {
                var key = Console.ReadKey();
                if (key.Key != ConsoleKey.Q)
                {
                    continue;
                }

                logger.Warn("'Q' detected. Attempting to stop.");
                CancelAndWait(source, messageFactory,
                              controllerTask, schedulerTask);

                break;
            }
        }