Example #1
0
        private void CheckServices(DateTime currentTime)
        {
            if (IsCheckInProgress())
            {
                return;
            }

            try
            {
                List <ServiceCheckerContainer> targetContainers = _serviceCheckers.
                                                                  Where(x => currentTime >= x.NextCheckTime).ToList();

                if (targetContainers.Count > 0)
                {
                    Task.Factory.StartNew(() => {
                        try
                        {
                            Parallel.ForEach(targetContainers, x =>
                            {
                                CheckResult r = x.Checker.Check();

                                DateTime nextCheckTime = DateTime.Now.AddSeconds(x.ServiceDef.Period);

                                logger.Info("Service " + x.ServiceDef.GetFullName() + ": " + r.GetText() + System.Environment.NewLine + "Next check time: " + nextCheckTime);

                                try
                                {
                                    _outputService.Write(DateTime.UtcNow, x.ServiceDef, r).ContinueWith(t =>
                                    {
                                        if (t.Exception != null)
                                        {
                                            logger.Error(t.Exception, "Output task error for service " + x.ServiceDef.GetFullName() + ": " + t.Exception.ToString());
                                        }
                                        else
                                        {
                                            logger.Error("Output task error for service " + x.ServiceDef.GetFullName() + " (detailed info is missed)");
                                        }
                                    }, TaskContinuationOptions.OnlyOnFaulted);
                                }
                                catch (Exception ex)
                                {
                                    logger.Error(ex, "Output error for service " + x.ServiceDef.GetFullName() + ": " + ex.Message);
                                }

                                x.NextCheckTime = nextCheckTime;
                            });
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex, "Parallel.ForEach exception: " + ex.Message);
                        }
                        finally
                        {
                            _checkComplete.Set();
                        }
                    });
                }
                else
                {
                    _checkComplete.Set();
                }
            }
            catch (Exception)
            {
                _checkComplete.Set();
                throw;
            }
        }