2012-04-24 17 views
2

作業者ロールを使用して作業するのは、何か問題が生じた場合にややこしいことです。私は、強制的にロールを強制終了して再起動するワーカーロールで例外が発生しています。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")を呼び出します。メッシュとしてテーブルストレージに表示されます。その後、ロールに例外が発生し、強制的に再起動するようになると、さらに多くのメッセージが発生します。ただし、ログにエラーメッセージはありません。

+0

例外をスローする前に遅延を追加できますか?ノード上のモニターエージェントがログを診断にアップロードする前に、役割がリサイクルされている可能性があります。 –

+0

有望な音、私は試してみるつもりです。診断モニタが強制的にスケジュールどおりにデータを要求に応じて保持するようにする方法はありますか?即座に解決でき、即座に役割が再開されました。 –

答えて

3

Run()メソッドが終了すると、ワーカーはリサイクルされます。作業者は、ログをリサイクルする前にストレージに転送する時間がない場合があります。

最も簡単な解決策は、キャッチ後に例外を再スローしないことです。その後、作業者の役割は手​​動でシャットダウンされるまで実行され続けます。

+1

私もエラーを記録した後にスリープを追加します。エラーに応じて、あなたのロールはwhileループのエラーをできるだけ早く通過し続けるかもしれません。 – knightpfhor

0

ワーカーロールのトレースリスナーを接続しましたか?以下をご覧ください。 http://blogs.msdn.com/b/jimoneil/archive/2010/10/08/azure-home-part-8-worker-role-and-azure-diagnostics.aspx

ワーカーロールapp.config。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
     <trace> 
      <listeners> 
       <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,       Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0,       Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
        name="AzureDiagnostics"> 
        <filter type="" /> 
       </add> 
      </listeners> 
     </trace> 
    </system.diagnostics> 
</configuration> 
関連する問題