4

全て、

既存のワーカー ロール コードを Azure Web ジョブに移行しています。Azure Web サイトと完全に統合するために、WebJob SDK (1.0) を使用しようとしています。

難しいのは、JobHost が、通常の属性ベースの呼び出しオプション (キュー、ブロブなど) の外にあるジョブでうまく動作しないことです。

Azure キュー/トピックなどをリッスンするように変更できない標準コードが既にあるため、Web ジョブ コードを使用してこれを行うことはできません。

したがって、WebJob Call メソッドを使用する必要があります。

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

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

NB:ライブラリを使用するときにすべてのアドバイスはConfigureAwait(false)を使用することですが、JobHostの内部ではこれを行わないため、独自のCallAsyncを使用していますが、ConfigureAwaitを使用して「呼び出し」コードを複製しています。私が知る限り、キャンセル トークンは JobHost では何もしません。

私の問題は、次に host.RunAndBlock(); を呼び出す必要があることです。これは問題ありませんが、クリーンアップ処理を実行する必要があります。ホストが既にキャンセルされているため、OnStop メソッドを使用して "CallAsync" を新たに呼び出すことはできません。そのため、できることは OnStop メソッドを直接呼び出すことだけです。残念ながら、提供された TextWriter クラスを介して WebSite ログに書き込むことができなくなります。

私が必要としているのは、JobHost が RunAndBlock 内でメソッドを呼び出す方法だと思います。そのため、ホストがシャットダウンしているときに発行されたキャンセル トークンを取得して、クリーンアップ コードを実行できます....しかし、ないようですこれを行う方法。

私が行方不明になっている明らかな方法はありますか?JobHost は、標準外のシナリオを処理するのが本当に苦手なようです :(

4

2 に答える 2

4

victor が言ったように、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 ループの後、開始されたタスクを停止することもできます。

于 2015-07-01T05:36:11.203 に答える