Esempio n. 1
0
        private async Task <int> CompleteScheduledTask(int ScheduledTaskId)
        {
            try
            {
                using (var db = new ChorebotSchedulerContext())
                {
                    while (DBInUse)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine(ScheduledTaskId + ": Db in use " + DateTime.Now);
                    }
                    this.DBInUse = true;
                    var ScheduledTask = db.ScheduledTasks.FirstOrDefault(x => x.ScheduledTaskId == ScheduledTaskId);
                    ScheduledTask.IsSent   = true;
                    ScheduledTask.DateSent = DateTime.Now;
                    db.SaveChanges();

                    var Call = db.Calls.FirstOrDefault(x => x.CallId == ScheduledTask.CallId);

                    Console.WriteLine("Completed Scheduled Task " + ScheduledTaskId + ":  " + Call.Url);

                    this.DBInUse = false;
                    return(1);
                }
            }
            catch (Exception ex)
            {
                this.DBInUse = false;
                AlertAdmin("database write issue", ex);
            }
            return(0);
        }
Esempio n. 2
0
        private async void SendCalls(Object o, ElapsedEventArgs e)
        {
            Console.WriteLine("Sending call " + DateTime.Now);
            try
            {
                using (var db = new ChorebotSchedulerContext())
                {
                    // Display the date/time when this method got called.
                    Console.WriteLine("Sending Calls: " + DateTime.Now);

                    //get each scheduled task that isn't complete
                    foreach (var ScheduledTask in db.ScheduledTasks.Where(x => !x.IsSent && x.DateScheduled <= DateTime.Now))
                    {
                        try
                        {
                            Calls Call = db.Calls.FirstOrDefault(x => x.CallId == ScheduledTask.CallId);
                            await SendCall(ScheduledTask);
                        }
                        catch (Exception ex)
                        {
                            AlertAdmin("Level 1 for scheduled task " + ScheduledTask.ScheduledTaskId, ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                AlertAdmin("Level 2", ex);
            }

            // Force a garbage collection to occur for this demo.
            GC.Collect();
        }
Esempio n. 3
0
        private void AlertAdmin(string Level, Exception ex = null, int?ScheduledTaskId = null)
        {
            try
            {
                using (var db = new ChorebotSchedulerContext())
                {
                    string Message = string.Empty;

                    if (ex != null)
                    {
                        Message = ex.Message + ex.StackTrace;
                    }

                    Console.WriteLine(Level + ":  " + Message);

                    if (ScheduledTaskId != null)
                    {
                        while (DBInUse)
                        {
                            Console.WriteLine("Db in use " + DateTime.Now);
                            Thread.Sleep(1000);
                        }
                        Console.WriteLine("Starting db change " + DateTime.Now);

                        DBInUse = true;
                        var ScheduledTask = db.ScheduledTasks.FirstOrDefault(x => x.ScheduledTaskId == ScheduledTaskId);
                        ScheduledTask.ErrorLog = Level + ":  " + Message;
                        db.SaveChanges();

                        DBInUse = false;
                    }
                }
            }
            catch (Exception ex2)
            {
                Console.WriteLine("Admin Alert: " + ex2.Message);
                this.DBInUse = false;
                //log?
            }
        }
Esempio n. 4
0
        private async void SetSchedule(Object o, ElapsedEventArgs e)
        {
            using (var db = new ChorebotSchedulerContext())
            {
                Console.WriteLine("Set Schedule " + DateTime.Now);
                var ActiveList = db.Calls.Where(x => x.IsActive && x.DateStart < DateTime.Now).OrderBy(x => x.DateStart).ToList();

                //day contidion
                foreach (var call in ActiveList)
                {
                    //check if active call exists for after right now already
                    if (db.ScheduledTasks.Count(x => x.CallId == call.CallId && x.DateScheduled > DateTime.Now) == 0)
                    {
                        DateTime TempDateTime = DateTime.Now + ScheduleInterval;

                        //find starting date to start looking
                        var TempDateTimeQuery = db.ScheduledTasks.OrderByDescending(x => x.DateScheduled).FirstOrDefault(x => x.CallId == call.CallId);

                        if (TempDateTimeQuery == null || TempDateTimeQuery.DateScheduled < call.DateStart)
                        {
                            TempDateTime = call.DateStart;
                        }
                        else
                        {
                            TempDateTime = TempDateTimeQuery.DateScheduled;
                        }

                        //find each scheduled task for each next 30 minutes
                        while (TempDateTime <= DateTime.Now + ScheduleInterval)
                        {
                            if (TempDateTime > DateTime.Now)
                            {
                                ScheduledTasks TempScheduledTask = new ScheduledTasks();

                                //public int CallId { get; set; }
                                TempScheduledTask.CallId = call.CallId;

                                TempScheduledTask.DateScheduled = TempDateTime;
                                TempScheduledTask.IsSent        = false;

                                while (DBInUse)
                                {
                                    //Console.WriteLine("DB In Use " + DateTime.Now);
                                    Thread.Sleep(1000);
                                }
                                //Console.WriteLine("Setting Schedule " + DateTime.Now);
                                DBInUse = true;
                                db.ScheduledTasks.Add(TempScheduledTask);
                                db.SaveChanges();
                                this.DBInUse = false;
                            }

                            //choose adding algorithm
                            if (call.IntervalTypeId == 1)
                            {
                                TempDateTime = TempDateTime.AddMinutes(call.Interval);
                            }

                            if (call.IntervalTypeId == 2)
                            {
                                TempDateTime = TempDateTime.AddHours(call.Interval);
                            }

                            if (call.IntervalTypeId == 3)
                            {
                                TempDateTime = TempDateTime.AddDays(call.Interval);
                            }

                            if (call.IntervalTypeId == 4)
                            {
                                TempDateTime = TempDateTime.AddMonths(call.Interval);
                            }
                        }// while (TempDateTime <= DateTime.Now + ScheduleInterval)
                    }
                }
            }
        }
Esempio n. 5
0
        private async Task SendCall(ScheduledTasks ScheduledTask)
        {
            try
            {
                using (var db = new ChorebotSchedulerContext())
                {
                    var Call = db.Calls.FirstOrDefault(x => x.CallId == ScheduledTask.CallId);
                    if (Call == null)
                    {
                        return;
                    }

                    string UrlRequest = Call.Url;

                    var QueryStringsQuery = db.QueryStrings.Where(x => x.CallId == Call.CallId && x.IsActive);

                    if (QueryStringsQuery != null && QueryStringsQuery.Count() > 0)
                    {
                        var QueryStringList = QueryStringsQuery.ToList();
                        UrlRequest += "?";

                        //get first
                        UrlRequest += QueryStringList[0].KeyString + "=" + QueryStringList[0].ValueString;

                        for (int i = 1; i < QueryStringList.Count; i++)
                        {
                            UrlRequest += "&";
                            UrlRequest += QueryStringList[i] + "=" + QueryStringList[i].ValueString;
                        }
                    }

                    var client = new HttpClient();
                    client.BaseAddress = new Uri(UrlRequest);

                    //Task<HttpResponseMessage> response = null;
                    HttpResponseMessage response = null;

                    switch (Call.CallType)
                    {
                    case "get":
                        Console.WriteLine("Starting:  " + ScheduledTask.ScheduledTaskId + Call.Url);
                        //Task.Run(async () =>
                        //{
                        response = await client.GetAsync(UrlRequest);

                        if (response == null)
                        {
                            AlertAdmin("null response", new Exception(Call.Url), ScheduledTaskId: ScheduledTask.ScheduledTaskId);
                        }
                        else if (response.StatusCode != HttpStatusCode.OK)
                        {
                            AlertAdmin(response.StatusCode.ToString(), new Exception(response.Content.ToString()), ScheduledTaskId: ScheduledTask.ScheduledTaskId);
                        }
                        else
                        {
                            await CompleteScheduledTask(ScheduledTask.ScheduledTaskId);
                        }
                        //}); //end Task.Run(()

                        break;

                    case "post":
                        Console.WriteLine("Starting:  " + Call.Url);
                        //Task.Run(async () =>
                        //{
                        response = await client.PostAsync(UrlRequest, null);

                        if (response == null)
                        {
                            AlertAdmin("null response", new Exception(Call.Url));
                        }
                        else if (response.StatusCode != HttpStatusCode.OK)
                        {
                            AlertAdmin(response.StatusCode.ToString(), new Exception(response.Content.ToString()));
                        }
                        else
                        {
                            await CompleteScheduledTask(ScheduledTask.ScheduledTaskId);
                        }
                        //}); //end Task.Run(()

                        break;

                    default:
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertAdmin("Send call issue", ex, ScheduledTask.ScheduledTaskId);
            }
        }