作業者ロールを使用して作業するのは、何か問題が生じた場合にややこしいことです。私は、強制的にロールを強制終了して再起動するワーカーロールで例外が発生しています。Azure Workerロールのエラー処理
私は、何が起きているのかを記録するために紺色の診断ソリューションを実装することに決めました。トレースするメッセージを書き込もうとすると動作しますが、例外をキャッチしてログに記録できません。私は自分のコードをtry catchで囲み、トレースする例外コンテンツを書き込もうとします。
このアプローチは正しいですか?それはなぜ機能しないのですか?ワーカーの役割に例外を記録する良い方法はありますか?ありがとうございました。私のコードは:
public class WorkerRole : RoleEntryPoint
{
private const int WAIT_INTERVAL_SECONDS = 15;
public override void Run()
{
Trace.WriteLine("$projectname$ entry point called", "Information");
while (true)
{
try
{
string id = MainWCFRole.Storage.TrackProcessingQueueDAO.retrieveMsgContents();
if ((id != null) && (!id.Equals("")))
{
var points = MainWCFRole.Storage.TrackRawDataDAO.retrieve(id);
Processor.process(id, points);
}
else
{
Thread.Sleep(WAIT_INTERVAL_SECONDS * 1000);
}
}
catch (Exception ex)
{
Trace.TraceInformation("Something went wrong");
Trace.TraceError(ex.ToString());
throw ex;
}
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
DiagnosticMonitorConfiguration dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();
dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
dmc.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
dmc.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
DiagnosticMonitor.Start("StorageConnectionString", dmc);
Trace.TraceInformation("Starting Worker Role TrackProcessor");
return base.OnStart();
}
}
Processor.process(id、points)は例外をスローするメソッドです。より正確には、SQL Azureクエリを呼び出すときです。私は、診断が機能することを知っています。なぜなら、ロールが始まると、Trace.TraceInformation( "Starting Worker Role TrackProcessor")を呼び出します。メッシュとしてテーブルストレージに表示されます。その後、ロールに例外が発生し、強制的に再起動するようになると、さらに多くのメッセージが発生します。ただし、ログにエラーメッセージはありません。
例外をスローする前に遅延を追加できますか?ノード上のモニターエージェントがログを診断にアップロードする前に、役割がリサイクルされている可能性があります。 –
有望な音、私は試してみるつもりです。診断モニタが強制的にスケジュールどおりにデータを要求に応じて保持するようにする方法はありますか?即座に解決でき、即座に役割が再開されました。 –