2012-04-24 1 views
2

작업자 역할로 작업하는 것은 문제가 발생하면 조금 까다 롭습니다. 역할을 종료하고 다시 시작해야하는 작업자 역할에서 예외가 발생했습니다.Azure Worker 역할 오류 처리

나는 무슨 일이 일어나고 있는지를 기록하기 위해 하늘색 진단 솔루션을 구현하기로 결정했습니다. 그것은 추적 할 메시지를 작성하려고 할 때 작동하지만 예외를 catch하고 로그 할 수 없습니다. 나는 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)는 예외를 throw하는 메서드입니다. 더 정확하게는, 나는 그것이 SQL Azure 쿼리를 호출하려고 할 때이다. 롤이 시작될 때 Trace.TraceInformation ("Starting Worker Role TrackProcessor")을 호출하기 때문에 진단이 작동한다는 것을 알고 있습니다. 메시 지로 테이블 저장 영역에 표시됩니다. 그런 다음 시간이 지나면 역할에 예외가 발생하고 다시 시작해야하므로 더 많은 메시지가 발생합니다. 그러나 로그에 오류 메시지가 없습니다.

+0

예외를 throw하기 전에 지연을 추가 할 수 있습니까? 노드의 모니터 에이전트가 진단 로그로 로그를 업로드 할 수 있기 전에 역할이 재활용 될 수 있습니다. –

+0

유망한 소리, 나는 시험 할 것이다. 진단 모니터가 일정이 아닌 요구에 따라 데이터를 유지하도록하는 방법이 있습니까? 즉시 해결할 수 있고 역할이 즉시 다시 시작되었습니다. –

답변

3

Run() 메서드가 종료되면 작업자가 재활용됩니다. 작업자는 로그가 재활용되기 전에 저장소로 전송할 시간이 없을 수 있습니다.

가장 간단한 해결 방법은 catch 한 후에 예외를 다시 throw하지 않는 것입니다. 그런 다음 사용자 역할이 수동으로 종료 될 때까지 작업자 역할이 계속 실행됩니다.

+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>