0

私の質問は以下の質問に似ています。

NoAutomaticTrigger タイプのジョブの継続的な Azure WebJob が停止しているときの通知

Amit のブログのアイデアを使用しましたが、ちょっとした障害にぶつかりました。

Web ジョブがポータルからシャットダウンされた場合にトリガーされるファイル ウォッチャーを Web ジョブに設定しています。

Web ジョブが終了する前に、ストレージ テーブルのいくつかのフラグを更新する必要があります。

問題は、ストレージ テーブルからレコードを取得しようとしている時点でコードが停止しているように見えることです。以下のコードの周りに例外ハンドラーがあり、コンソールに例外メッセージが書き込まれません。

以下は私のコードです

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("my storage key");
var tableClient = storageAccount.CreateCloudTableClient();
var table = tableClient.GetTableReference("myTable");
TableOperation operation = TableOperation.Retrieve("partKey", "rowKey");
var result = table.Execute(operation); // stucks here
   if (result.Result != null)
     {
        MyEntity entity = (MyEntity)result.Result;
        if (entity != null)
         {
           entity.IsRunning = false; //reset the flag
           TableOperation update = TableOperation.InsertOrReplace(entity);
           table.Execute(update); //update the record
         }
     }

stopping_wait_timeinを 300 秒に増やしましたsettings.jobが、まだ運がありません。

4

1 に答える 1

0

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();
    }
}

正常なシャットダウンはあなたの機能に入ります:

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
        }

       // This code will be executed once the webjob is going to shutdown
       Console.Out.WriteLine("Webjob is shuting down")
    }
}

while ループの後、開始されたタスクを停止することもできます。

于 2015-12-15T09:21:45.700 に答える