Я разработал промежуточное программное обеспечение, которое обеспечивает функциональность RPC для нескольких клиентских приложений на разных платформах в нашей организации. Промежуточное программное обеспечение написано на C # и работает как служба Windows NT. Он обрабатывает такие вещи, как доступ к файлам к сетевым ресурсам, доступ к базам данных и т. Д. Промежуточное программное обеспечение размещается на двух высокопроизводительных системах под управлением Windows Server 2008.
Когда один из наших администраторов сервера перезагружает компьютер, главным образом для обновления Windows, возникают серьезные проблемы с поведением системы в отношении моей службы NT. Моя служба предназначена для немедленной остановки прослушивания новых подключений, немедленного начала отклонения новых запросов для существующих подключений и, в противном случае, для максимально быстрого отключения в случае запроса OnStop или OnShutdown от SCM. Тем не менее, для поддержания целостности системы операциям, которые в данный момент выполняются, разрешено продолжать в течение разумного времени. Обычно сервер выключается в течение 30 секунд (например, когда служба останавливается вручную). Однако, когда система получает команду на перезагрузку, моя служба немедленно теряет доступ к сетевым дискам и UNC-путям, что вызывает проблемы целостности данных для любых открытых файлов и частичную запись в эти расположения. Мой сервис перечисляет Рабочую станцию (и, следовательно, SMB Redirector) как зависимость, поэтому я думаю, что мой сервис нужно будет остановить до остановки Workstation / Redirector, если Windows соблюдает эти зависимости.
По сути, мое приложение вынуждено аварийно завершить работу и завершиться с ошибкой, вызывая удаленные вызовы процедур и, в конечном итоге, принудительно завершаться операционной системой по истечении времени ожидания (кажется, оно составляет порядка 20-30 секунд).
В отличие от приложения Windows, моя служба Windows NT, по-видимому, не имеет возможности остановить текущее завершение работы системы, задержать выключение системы или даже просто сохранить все ожидающие записи на общий сетевой диск до принудительного принудительного завершения. отключен и отключен. Как разработчик NT Service должен иметь какую-либо целостность приложений в этой среде? Почему Forms Applications получают все возможности завершить свой бизнес до завершения работы, а службы, похоже, не получают таких преимуществ?
Я пробовал:
Вызов SetProcessShutdownParameters через p / invoke, чтобы попытаться уведомить мое приложение о завершении работы раньше, чтобы избежать отключения Redirector до того, как я это сделаю.
Вызов ServiceBase.RequestAdditionalTime со значением, меньшим или равным двухминутному пределу.
Настройка WaitToKillServiceTimeout
Все, что я могу придумать, чтобы ускорить отключение моей службы.
Но, в конце концов, я все еще получаю ~ 30 секунд проблемного времени, в течение которого моя служба, похоже, даже не уведомлена о событии OnShutdown, но запросы не выполняются из-за того, что перенаправитель больше не обслуживает мои запросы общего сетевого ресурса. .
Как решить эту проблему? Что я могу сделать, чтобы отложить или остановить завершение работы или, по крайней мере, разрешить закрыть мои активные задачи без исчезновения служб перенаправления из-под меня? Я могу понять, что Microsoft пытается сделать, чтобы службы не тормозили и не показывали выключения, но это кажется большой целью для клиентских операционных систем Windows, а не для серверов. Я не хочу, чтобы мои серверы быстро отключались, я хочу целостности работы и постепенного отключения.
Заранее благодарим за любую помощь, которую вы можете оказать.
ОБНОВЛЕНИЕ: я сделал точные сроки. Во время тестового выключения я получил уведомление о выключении в 23:55:58 и заметил, что в 23:56:02 потерял связь с сетевым ресурсом. Поэтому в течение четырех секунд я потерял способность сохранять любое активное состояние.