/// <summary> /// Pokrece se svaki mesec, i vrsi racunanje trenutne potrosnje za prethodni mesec /// </summary> public override void Collector() { Console.WriteLine(DateTime.Now + ": Monthly job is running..."); // Ceka signal od DailyJob-a da je zavrsio posao DJ_MJ_Semapthore.WaitOne(); // Inicijalizacija Tabele TableInitializer <DailyItem, MonthlyItem>(); // Signalizira AnnualJob-u da moze da pocne MJ_YJ_Semapthore.Release(); while (true) { DateTime current = DateTime.Now; // Pocetak meseca DateTime startTime = CalculateStartInterval(current); // Kraj meseca DateTime endTime = CalculateEndInterval(startTime); Console.WriteLine(DateTime.Now + ": Monthly job sleeps..."); while (true) { // Trenutno vreme current = DateTime.Now; // Vreme koliko treba da se spava int sleepTime = (int)((endTime - current).TotalMilliseconds); if (sleepTime < 0) { Thread.Sleep(Int32.MaxValue); } else { Thread.Sleep(sleepTime); break; } } // Ceka signal od DailyJob-a da je zavrsio posao DJ_MJ_Semapthore.WaitOne(); Console.WriteLine(DateTime.Now + ": Monthly job calculates..."); CalculateAndStore <DailyItem, MonthlyItem>(startTime, endTime); // Ako je to decembar, poslednji dan u godini, i poslednji sat u danu tada treba da se aktivira AnnualJob if (current.Month == 12 && current.Day == DateTime.DaysInMonth(current.Year, current.Month) && current.Hour == 23) { // Signalizira AnnualJob-u da moze da pocne MJ_YJ_Semapthore.Release(); } } }
/// <summary> /// Pokrece se svaki dan u 24h, i vrsi racunanje trenutne potrosnje za prethodni dan /// </summary> public override void Collector() { Console.WriteLine(DateTime.Now + ": Daily job is running..."); // Ceka znak od HourlyJob-a da je zavrsio pa da moze da odradi svoj posao HJ_DJ_Semapthore.WaitOne(); // Inicijalizacija Tabele TableInitializer <HourlyItem, DailyItem>(); // Obavesti MonthlyJob da moze da pocne DJ_MJ_Semapthore.Release(); while (true) { // Trenutno vreme DateTime current = DateTime.Now; // Pocetak dana DateTime startTime = CalculateStartInterval(current); // 23:59 min - kraj dana DateTime endTime = CalculateEndInterval(startTime); // Vreme koliko treba da se spava do prvog okruglog sata int sleepTime = (int)(endTime - current).TotalMilliseconds; Console.WriteLine(DateTime.Now + ": Daily job sleeps..."); // Spava do kraja dana Thread.Sleep(sleepTime); // Ceka znak od HourlyJob-a da je zavrsio pa da moze da odradi svoj posao HJ_DJ_Semapthore.WaitOne(); Console.WriteLine(DateTime.Now + ": Daily job calculates..."); CalculateAndStore <HourlyItem, DailyItem>(startTime, endTime); // Ako je to zadnji dan u mesecu i kraj dana onda treba da se aktivira MonthlyJob if (current.Day == DateTime.DaysInMonth(current.Year, current.Month) && current.Hour == 23) { // Obavesti MonthlyJob da moze da pocne DJ_MJ_Semapthore.Release(); } } }