2008-10-29 1 views
2

Я работаю над службой Windows, которая опроса для подключения к устройствам с поддержкой сети каждые 15 секунд. Если служба не может подключиться к устройству, она выдает исключение и снова пытается за 15 секунд. Все это отлично работает.Как я могу условно исключить исключения приложений, записанные в журнал событий?

Но, скажем, одно из устройств отключено на день или больше. Я заполняю свой журнал исключений с тем же исключением каждые 15 секунд. Существует ли стандартный способ предотвращения исключения исключения из журнала событий в случае, если исключение не изменилось за последние х часов?

ответ

3

Один хороший способ добиться того, что вам нужно, - использовать шаблон проектирования автоматического выключателя.

Я впервые прочитал об этом в книге «Отпустите это! Разработка и развертывание готового программного обеспечения для производства» Майкла Т. Найгарда из Pragmatic Press, p104-107.

Идея выключателя заключается в том, что он находится на пути соединения между системами, проходя через соединения, наблюдая за «условием прерывания». Например, он может срабатывать только в том случае, если все пять соединений в строке не сработали.

После того, как цепь сломалась, все вызовы через автоматический выключатель немедленно прекращаются, не обращаясь к внешней службе. Это продолжается до тех пор, пока не произойдет тайм-аут, когда прерыватель переходит в полуоткрытое состояние. Выполняется следующий вызов - отказ приводит к сбросу таймаута, успеху в закрытии выключателя и возобновлению работы системы.

Быстро найденный google a post by Tim Ross, который хорошо читается и более подробно освещен.

В вашем случае вы можете использовать автоматический выключатель с таймаутом 10 минут и триггер из 5 отказов. Тогда ваши файлы журналов будут содержать в случае сбоя за весь день пять исключений, зарегистрированных для исходной проблемы, а затем всего шесть часов в час (по сравнению с 240 с интервалом 15 секунд), что указывает на то, что проблема сохраняется.

В зависимости от ваших требований вы можете включить ручной «сброс» выключателя, или вы можете просто оставить его для автоматического сброса, когда 10-минутный тайм-аут покажет, что все вернулось в норму. Это может быть полезно - как правило, чем меньше проблем с системными администраторами, тем лучше им это нравится.

+0

приятный ответ, очень хорошо поставленный и удобный паттерн для вашего словаря – dove 2008-10-30 09:31:51

1

Возможно, есть рабочий процесс, который, если опросы не пройдены определенное количество раз, интервал опроса увеличивается. например опросы каждые 15 секунд, например, 3 раза, если это не удается, увеличьте интервал опроса до одной минуты, если он терпит неудачу в течение n раз, а затем увеличьте время до одного часа.

Чтобы быть честным, рабочий процесс выше не позволяет решить вашу проблему. Если бы я был вами, я бы отменил рабочий процесс. Вместо опроса серверов для устройств, почему бы не сделать это наоборот? Когда устройство подключено к сетевой машине, ваша клиентская служба отправляет сообщение на сервер, чтобы сервер знал, что устройство подключено и доступно.

Надеется, что это помогает ...

RWendi

1

При использовании обработки блока исключений в приложении, я предполагаю, что вы делаете, вы можете переключаться между различными стратегиями обработки исключений. Сначала это политика, которая записывает информацию об исключении в журнал событий, а затем после n попыток или периода времени вы можете переключиться на политику, которая не входит в журнал событий.

Возрастающая продолжительность между попытками подключения, вероятно, решит вашу проблему. . newTimeout = n * atomicTimeout, где n - число attemts.

0

насчет ...

int count = 0; 
while (true) 
{ 
     try 
     { 
      AttemptStuff() 
     } 
     catch (Exception ex) 
     { 
      if(count < 10) 
      { 
       EventLog.WriteEntry("my service", ex.ToString(), EventLogEntryType.Error); 
       count++; 
      } 
     } 
} 
Смежные вопросы