2015-01-04 5 views
2

Все,Уведомление при непрерывной Azure WebJob останавливается для заданий типа NoAutomaticTrigger

Я проникаю существующий код Worker Role на Azure Web работу. Я пытаюсь использовать WebJob SDK (1.0), чтобы у меня была полная интеграция с Azure Web Site.

Мой трудно, что JobHost не дружат с рабочими местами, которые находятся вне его обычно Атрибут на основе вариантов Invoke (Очереди, Blobs и т.д.)

У меня уже есть стандартный код, который я не могу изменить, чтобы слушать Azure Очереди/Темы и т. Д., Поэтому я не могу использовать код WebJob для этого.

Поэтому мне нужно использовать метод WebJob вызова:

var cancelTokenSource = new CancellationTokenSource(); 
var onStartMethod = typeof(Program).GetMethod("OnStart", BindingFlags.Static | BindingFlags.Public); 

host.CallAsync(onStartMethod, cancelTokenSource.Token) 
    .ConfigureAwait(false) 
    .GetAwaiter() 
    .GetResult(); 

NB: Я использую свой собственный CallAsync, как и все советы использовать ConfigureAwait (ложь) при использовании библиотеки, но внутренности JobHost Безразлично» t делаю это, поэтому я копирую сам код вызова, но с ConfigureAwait. Насколько я могу судить, токен отмены не делает ничего в JobHost.

Моя проблема в том, что мне тогда необходимо вызвать host.RunAndBlock(); чтобы прекратить выполнение задания, что хорошо, но тогда мне нужно запустить некоторую очистку. Я не могу сделать новый вызов «CallAsync» с помощью метода OnStop, поскольку хост уже отменен, поэтому все, что я могу сделать, это сделать прямой вызов моего метода OnStop. К сожалению, я теряю возможность писать в журнал WebSite через предоставленный класс TextWriter.

Я думаю, что мне нужно, чтобы JobHost вызывал мой метод в RunAndBlock, поэтому я могу подобрать маркер отмены, который был запущен, когда хост выключился, а затем выполнить мой код очистки .... но там не похоже на это.

Есть ли очевидный способ, которым я не хватает? JobHost кажется очень бедными в сценариях обработки вне это нормы :(

ответ

2

Как победитель сказал, вы могли бы использовать Microsoft.Azure.WebJobs.WebJobsShutdownWatcher
Это реализация решения Amit: WebJobs Graceful Shutdown

Так я нашел решение сделать это:
Никакие изменения в Program.cs

class Program 
{ 
    static void Main() 
    { 
     var host = new JobHost(); 
     host.Call(typeof(Startup).GetMethod("Start")); 
     host.RunAndBlock(); 
    } 
} 

изящная отключение идет в Startup.cs:

public class Startup 
{ 
    [NoAutomaticTrigger] 
    public static void Start(TextWriter log) 
    { 
     var token = new Microsoft.Azure.WebJobs.WebJobsShutdownWatcher().Token; 
     //Shut down gracefully 
     while (!token.IsCancellationRequested) 
     { 
      // Do somethings 
     } 
    } 
} 

После цикла while вы также можете остановить запущенные задачи.

0

NB: Я использую свой собственный CallAsync, как все советы является использование ConfigureAwait (ложь) при использовании библиотеки, но внутренность JobHost не делает этого , поэтому я тиражирование это «вызов» код сам, но с ConfigureAwait. маркер отмены ничего не делает в JobHost насколько я могу сказать.

это ожидается, потому что вы передаете свой собственный маркер отмены который не отменяется кем-либо. Маркер отмены webjobs отменяется, когда shutdown notification is sent или хост остановлен/удален. Если вы хотите получить ссылку на токен отмены от o У вас есть функция webjob, вы должны держать ее в статической переменной или что-то подобное.

Если вы хотите использовать свой токен отмены, вы можете использовать Microsoft.Azure.WebJobs.WebJobsShutdownWatcher, чтобы получить уведомление об отключении.

Моя проблема в том, что мне тогда необходимо вызвать host.RunAndBlock(); чтобы прекратить выполнение задания, что хорошо, но тогда мне нужно запустить некоторую очистку. Я не могу сделать новый вызов «CallAsync» с помощью метода OnStop, поскольку хост уже отменен, поэтому все, что я могу сделать, это сделать прямой вызов моего метода OnStop. К сожалению, я теряю возможность писать в журнал WebSite через предоставленный класс TextWriter.

Для этого нет готового решения, но вы можете вызвать функцию очистки из работающего webjob (если есть).Если вам нужна очистка вне функции, и вы также хотите вести журнал, вы можете использовать только консольное ведение журнала - пишите на консоль. Журналы будут отображаться на панели инструментов WebJobs на странице webJob. Я любопытный, если вам нужна очистка вне функции, каков сценарий?

+0

Мой сценарий заключается в том, что начало задания Я подписываюсь на очереди/темы, используя свой собственный код адаптера для Azure Service Bus (т.е. я не могу использовать встроенный механизм для этого), тогда мне нужно блокировать ожидание сообщения, а затем, когда WebJob остановлен, мне нужно перехватить это и вызвать логику «Отменить подписку». Мне сложно работать (а), как получить токен отмены, используемый WebJob при выключении (это нигде не отображается) или (б) перехватить остановку, поскольку нет события, поднятого, что я могу подключиться к , – GrahamB

+0

Вы можете проверить, когда WebJobs останавливается/перезапускается, следуя коду http://blog.amitapple.com/post/2014/05/webjobs-graceful-shutdown/ –