Windows Azure - необходимо остановить WorkerRole изнутри - PullRequest
4 голосов
/ 22 апреля 2011

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

Мигрируя их в Windows Azure, в WorkerRole я хотел бы сделать то же самое: возможность остановить выполнение WorkerRole изнутри.

Я просто столкнулся с небольшой проблемой ...

Когда метод Run заканчивается, метод WorkerRole OnStop запущен, тогда это перезапущено ... Из того, что я прочитал, это нормальное поведение для WorkerRole.

Тогда мой вопрос: как сказать, что ' задание выполнено, не перезапускайте, пожалуйста '

Ответы [ 6 ]

3 голосов
/ 22 апреля 2011

Вы не можете остановить конкретный экземпляр роли.Вы можете уменьшить, скажем, с 3 экземпляров до 1, но вы не можете выбрать, какие из них следует прекратить.

Если вы говорите о рабочей роли с одним экземпляром, которую нужно запустить, обработайте что-нибудь, а затем завершите работу (скажем, один раз в день), рассмотрите возможность переноса этой роли в собственное развертывание.Затем, используя API управления, разверните его, дайте ему поработать час (или столько, сколько вам нужно), а затем приостановите + удалите его.

2 голосов
/ 22 апреля 2011

Я не совсем уверен, что это на самом деле возможно.Вы можете использовать

Thread.Sleep(Timeout.Infinite);

Но поскольку рабочая роль развернута в облаке, вам все равно придется платить, я думаю. Единственный способ действительно остановить это - приостановить всю роль с платформы Azure.

0 голосов
/ 28 января 2013

недавно я столкнулся с той же проблемой. Моя проблема исправлена ​​путем комментирования части рабочей роли из файла ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg и ServiceDefinition.csdef и упаковки проекта.

0 голосов
/ 17 июня 2011

Я думаю, что вы можете использовать Thread.Suspend () http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx, и если вы хотите возобновить его снова, используйте Thread.Resume ()

0 голосов
/ 23 апреля 2011

Если я правильно читаю ваш вопрос .... Процесс рабочей роли остановлен, но затем снова запускается?

Я столкнулся с проблемами, когда, если рабочая роль долго выполняется, она, по сути,начинается снова.В результате Azure предполагает, что через длительное время (обычно 30 секунд) он предполагает, что роль зависла, и запишет сообщение обратно в рабочую очередь, чтобы убедиться, что процесс завершен.

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

Дополнительная информация здесь

http://guerillaprogrammer.com/jakew/post/2010/03/23/Expiring-Azure-Queue-Message.aspx

0 голосов
/ 22 апреля 2011

Если ваша конкретная роль использует только один экземпляр, вы можете уменьшить количество экземпляров для этой роли до 0 с помощью API управления.Переключение определенной роли не поддерживается, но вы можете заставить ее работать, создав службу kill switch, которую вы можете вызывать для конкретного экземпляра и одновременно уменьшить количество экземпляров.Это требует немного кода сантехники, но выполнимо.

...