powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как корректно завешать длительные операции на хосте, если поступила команда останова ?
5 сообщений из 5, страница 1 из 1
Как корректно завешать длительные операции на хосте, если поступила команда останова ?
    #38627956
HowToSoap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Имеется WCF служба. Хостится в Win-Службе.

Что происходит со службой и ее обрабатываемыми в данный момент запросами, когда закрывается хост ?
Где-то читал (возможно Дж Леве), что выполняемые запросы будут продолжены до их завершения (что, 3 минуты хост будет висеть если там операция длительная ?), после завершения всех запросов хост закроется. При этом если будут приходить новые запросы, когда хост закрывается, они будут ловить исключение.

Про WCF много чего написано. Но удивительно мало про моменты завершения. Или я очень плохо искал.
Знаете ли кто про статью, расписывающую что конкретно происходит при останове сервиса, и имеющую рекомендации, как проектировать свои службы в виду этой информации ?

В частности меня интересует такой вопрос - как лучше поступать, если win-службу останавливают, а у меня там обрабатываются запросы ?. Как их КОРРЕКТНО остановить, что нужно вернуть клиенту при этом ? подумываю использовать глобальный CancelationToken, который должны отслеживать выполняемые операции, но хотелось бы все же узнать готовые решения сначала.

Как вы сами поступаете ?
...
Рейтинг: 0 / 0
Как корректно завешать длительные операции на хосте, если поступила команда останова ?
    #38627971
HowToSoap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Win служба должна завершатся в течении 30 секунд.
Поэтому ищу как корректно все завершать. Что там возвращать, какие исключения генерить (клиенту, в связи с тем что обработка запроса была прервана) и т.д.
...
Рейтинг: 0 / 0
Как корректно завешать длительные операции на хосте, если поступила команда останова ?
    #38633153
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HowToSoapЧто происходит со службой и ее обрабатываемыми в данный момент запросами, когда закрывается хост ?
Смотря как закрывать.

Если использовать метод Close , то будут запрещены все новые запросы, а сам метод будет ждать пока не завершатся все текущие запросы.
Если же вызвать Abort , то будут прерваны и все текущие исполняющиеся запросы. Будут ли остановлены потоки, в которых они работали я не знаю, скорее всего Thread.Abort будет вызван.

HowToSoapВ частности меня интересует такой вопрос - как лучше поступать, если win-службу останавливают, а у меня там обрабатываются запросы ?. Как их КОРРЕКТНО остановить, что нужно вернуть клиенту при этом ?
Я бы давал всем запущенным запросам шанс отработать и закрывал бы соединения с помощью асинхронной версии BeginClose .

Т.е. примерно так (навскидку):
- В методе OnStop службы, вызываем BeginClose у нашего хоста. Чтобы не уйти в бесконечное ожидание все же поставить некоторый разумный таймаут. Ну например минуту (таймаут зависит от вашей предметной области)
- Затем начинаем в цикле (с некоторым таймаутом, например 20 секунд) опрашивать, завершиласт ли операция закрытия (у IAsyncResult, который вам вернется есть свойство IsCompleted ).
- Если при очередном опросе хост еще не закрылся, то запрашиваем дополнительное время для завершения службы через метод RequestAdditionalTime .
- Если хост закрылся (или истек наш исходный таймаут - тут уже без разницы), то вызываем EndClose и выходим из метода OnStop

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

HowToSoapКак вы сами поступаете ?
Мы не используем self-hosting. IIS все подобные заботы берет на себя.
...
Рейтинг: 0 / 0
Как корректно завешать длительные операции на хосте, если поступила команда останова ?
    #38633165
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HowToSoapWin служба должна завершатся в течении 30 секунд.
Это первый квант времени. Вы можете запросить еще через метод RequestAdditionalTime .
Или просто увеличить текущий выделенный.

Т.е. можно использовать даже более простую схему, чем я описал выше:
- запросить через RequestAdditionalTime побольше времени (например, 3 минуты - я точно не помню, какой там предел на запрос).
- вызвать обычный Close с аналогичным временем (ну или чуть меньше).

Если все запросы отработают за выбранный вами таймаут метод Close завершится сам. Если истечет таймаут он просто прервет все запросы и тоже завершится. Т.е. вы получите то же самое поведение, что я описал выше. Но код меньше.
...
Рейтинг: 0 / 0
Как корректно завешать длительные операции на хосте, если поступила команда останова ?
    #38634617
HowToSoap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МихаилР,

Спасибо за прояснение. В принципе, я так и думал.

Мне понравился вариант с асинхронным BeginClose и периодическим под-запросом дополнительного времени, до завершения.


Вот я тут еще полезную ссылочку нашел на метод расширения для корректного закрытия соединений (клиента и хоста):
http://stackoverflow.com/questions/13000736/is-it-correct-to-implement-idisposable-on-singleton/13013904#13013904
Обычный Dispose скрывает возникшие исключения.

МихаилРЕсли же вызвать Abort, то будут прерваны и все текущие исполняющиеся запросы. Будут ли остановлены потоки, в которых они работали я не знаю, скорее всего Thread.Abort будет вызван.

Thread.Abort страшная вещь:
http://sergeyteplyakov.blogspot.ru/2011/01/threadabort.html

Как я понял, она может ударить в любом месте программы, а не только в том потоке, для которого вызывалась.
Наверное в WCF используется что-то более безопасное.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как корректно завешать длительные операции на хосте, если поступила команда останова ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]