Azure で Web ジョブを作成しました。Web ジョブは、継続的に実行されるタイプです。キューにメッセージがある場合に呼び出される Web ジョブ機能です。Azure ストレージ エクスプローラーまたは mvc Web アプリのいずれかを使用してキューにメッセージを追加することで、Web ジョブ機能を呼び出すことができます。
Web ジョブは、ローカルでコマンド ラインを実行して作業を実行するのに約 1 時間かかるコンソール アプリケーションです。Web ジョブを呼び出すと、正常に開始されましたが、しばらくすると (約 5 ~ 10 分)、Web ジョブ ログで関数の呼び出しステータスが "Never Finished" になっています。
だから私の質問は次のとおりです: -
1) この問題は長時間実行されているタスクによるものですか。
2) この問題は、処理中のエラーによるものですか (ただし、ローカルで実行できます)。
3) Web ジョブによって追加されたデータベースからレコードを削除すると、Web が再び開始されたことがわかります。なんで?
4) プロセスの完了後にキューからメッセージを削除する必要がある場合は?
これは、Web ジョブから呼び出される私のコード スニペットです。
namespace Scheduler
{
class Program
{
static void Main()
{
JobHost host = new JobHost();
host.RunAndBlock();
}
public static void ProcessQueueMessage([QueueTrigger("webjobschedularargs")] string schedularargs,
[Blob("containername/blobname")]TextWriter writer)
{
//writer.WriteLine(inputText);
string[] args = schedularargs.Split(new char[0]);
RunProcess(args);
writer.WriteLine(schedularargs);
}
private static void RunProcess(string[] args)
{
if (!Initialize())
{
// Log issue
Console.WriteLine("Error!!! Unable to initialize.");
Console.ReadKey(true);
// We're done
return;
}
#region Run processor
var options = new Options();
var timer = new Stopwatch();
if (CommandLine.Parser.Default.ParseArguments(args, options))
{
Console.WriteLine("Processing: ");
timer.Start();
if (options.Profiles != null)
{
foreach (var profile in options.Profiles)
{
Console.Write(profile + ", ");
}
Console.WriteLine();
}
if (options.Reports != null)
{
foreach (var report in options.Reports)
{
Console.Write(report + ", ");
}
Console.WriteLine();
}
var processor = new Processor(options);
processor.Start();
}
#endregion
// Log reason why not valid command args
//-----call run processor function
timer.Stop();
Console.WriteLine("Total time (ms): " + timer.ElapsedMilliseconds);
Console.WriteLine("Done!!! Everything went ok.");
//#if LOCAL
// Console.ReadKey(true);
//#endif
}
private static bool Initialize()
{
// Set ninject values
NinjectConfig.Start();
// TODO: Set automapper values ??
return true;
}
}
}
編集:-
Azureで次のエラーが発生しています..
[07/10/2014 15:50:52 > 32a9e0: エラー] 未処理の例外: Microsoft.WindowsAzure.Storage.StorageException: リモート サーバーがエラーを返しました: (404) 見つかりません。---> System.Net.WebException: リモート サーバーがエラーを返しました: (404) 見つかりません。
[07/10/2014 15:50:52 > 32a9e0: エラー] System.Net.HttpWebRequest.GetResponse() で
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T] (RESTCommand`1 cmd、IRetryPolicy ポリシー、OperationContext operationContext) で
[07/10/2014 15:50:52 > 32a9e0: ERR] --- 内部例外スタック トレースの終了 ---
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T] (RESTCommand`1 cmd、IRetryPolicy ポリシー、OperationContext operationContext) で
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.WindowsAzure.Storage.Queue.CloudQueue.UpdateMessage (CloudQueueMessage メッセージ、TimeSpan visibilityTimeout、MessageUpdateFields updateFields、QueueRequestOptions オプション、OperationContext operationContext) で
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.Azure.Jobs.UpdateQueueMessageVisibilityCommand.TryExecute() で
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.Azure.Jobs.LinearSpeedupTimerCommand.Execute() で
[07/10/2014 15:50:52 > 32a9e0: エラー] Microsoft.Azure.Jobs.IntervalSeparationTimer.RunTimer (オブジェクトの状態) で
[07/10/2014 15:50:52 > 32a9e0: エラー] System.Threading.TimerQueueTimer.CallCallbackInContext (オブジェクトの状態) で
[07/10/2014 15:50:52 > 32a9e0: エラー] System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の preserveSyncCtx) で
[07/10/2014 15:50:52 > 32a9e0: エラー] System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の preserveSyncCtx) で
[2014 年 7 月 10 日 15:50:52 > 32a9e0: エラー] System.Threading.TimerQueueTimer.CallCallback() で
[2014 年 7 月 10 日 15:50:52 > 32a9e0: エラー] System.Threading.TimerQueueTimer.Fire() で
[2014 年 7 月 10 日 15:50:52 > 32a9e0: エラー] System.Threading.TimerQueue.FireNextTimers() で
[2014 年 7 月 10 日 15:50:52 > 32a9e0: エラー] System.Threading.TimerQueue.AppDomainTimerCallback() で
[2014 年 7 月 10 日 15:50:52 > 32a9e0: 情報] ................................... ................................................................... ................................................................... ................ [07/10/2014 15:50:52 > 32a9e0: SYS ERR] 終了コード -532462766 が原因でジョブが失敗しました
[07/10/2014 15:50:52 > 32a9e0: SYS INFO] プロセスがダウンし、0 秒間待機しました
[07/10/2014 15:50:52 > 32a9e0: SYS INFO] ステータスが PendingRestart に変更されました
[07/10/2014 15:50:57 > 32a9e0: SYS INFO] スクリプト ホスト - 'WindowsScriptHost' でスクリプト 'Scheduler.exe' を実行します
[07/10/2014 15:50:57 > 32a9e0: SYS INFO] ステータスが実行中に変更されました
エラーを見て、コンソールアプリから同じ機能をローカルで実行しようとしましたが、その機能は機能します.複数回実行した後、機能が正確に5分間実行されていることがわかりました.Webジョブで関数を実行する時間が拘束されている場合.
ありがとう。