2010-12-01 7 views
8

Ich habe eine Azure WorkerRole, die ohne ersichtlichen Grund stoppt (keine Ausnahmen werden ausgelöst). Es stoppt jedes Mal an der gleichen Stelle, aber der Code führt einfach einen Prozess aus, der ungefähr 20 Sekunden dauert. Kann jemand postulieren, warum dies geschieht? Gibt es ein Zeitlimit für die OnStart() -Methode, die mir nicht bekannt ist?Azure WorkerRole Stoppen sofort nach dem Start

Hier ist eine Aufschlüsselung dessen, was in meiner Arbeiter Rolle geschieht:

OnStart() -> Diagnose

Run konfiguriert() ->

  1. Ein Timer eingestellt ist (60) bis auslösen, das Fleisch der Anwendung
  2. Ein neuer Thread einige Standardeinstellungen gestartet laden (dauert ca. 30 Sekunden)

Der Code kommt nie zum Fleisch von # 1.

Für # 1 oben habe ich es mit und ohne Timer (kein Unterschied) versucht. Für # 2 oben habe ich es mit und ohne einen neuen Thread versucht (kein Unterschied).

Hier ist die Debug-Ausgabe für meine Arbeiter Rolle:

WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStart() 
Microsoft.WindowsAzure.ServiceRuntime Information: 202 : Role entrypoint . COMPLETED OnStart() 
The thread 'Role Initialization Thread' (0x29fc) has exited with code 0 (0x0). 
Microsoft.WindowsAzure.ServiceRuntime Information: 203 : Role entrypoint . CALLING Run() 
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Jason A. Kiesel\Projects\FS_CITYSOURCED\WorkersAzure\bin\Stage\WorkersAzure.csx\roles\Workers\approot\FreedomSpeaks.Logging.dll', Symbols loaded. 
Microsoft.WindowsAzure.ServiceRuntime Warning: 204 : Role entrypoint . COMPLETED Run() ==> ROLE RECYCLING INITIATED 
Microsoft.WindowsAzure.ServiceRuntime Information: 503 : Role instance recycling is starting 
The thread 'Role Start Thread' (0x1fa0) has exited with code 0 (0x0). 
The thread '<No Name>' (0x1624) has exited with code 0 (0x0). 
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll' 
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll' 
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll' 
'WaWorkerHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
Microsoft.WindowsAzure.ServiceRuntime Information: 205 : Role entrypoint . CALLING OnStop() 
WaWorkerHost.exe Information: 0 : deployment(108).ApiAzure.Workers.0 - Workers.OnStop() 
Microsoft.WindowsAzure.ServiceRuntime Information: 206 : Role entrypoint . COMPLETED OnStop() 
The thread 'Role Stop Thread' (0x2dac) has exited with code 0 (0x0). 
The program '[12228] WaWorkerHost.exe: Managed (v4.0.30319)' has exited with code -66053 (0xfffefdfb). 
+0

Können Sie den Code veröffentlichen? – Igorek

+1

Ich fand heraus, warum die Anwendung abstürzte und eine Reparatur einleitete, aber es ergibt für mich immer noch keinen Sinn, warum die Arbeiterrolle in erster Linie abstürzen würde. Der "config" -Abschnitt der App, der beim Start ausgelöst wurde, hatte eine Methode, die viel Zeit in Anspruch nahm. Ich habe diesen Abschnitt des "config" -Codes verschoben, um bei Bedarf ausgeführt zu werden (lazy loaded). Das schien das Problem zu lösen. – Jason

+0

Wie hast du herausgefunden, warum es zusammenbrach? Ich habe das selbe Problem, aber ohne Ausnahme ist es ziemlich schwer zu debuggen:/ –

Antwort

7

Ohne den Code zu sehen, es klingt wie Ihre Run-Methode verlässt. Wenn die Laufmethode jemals beendet wird, wird die Rolle gestoppt. Die Standardarbeitserrolle, die beim Hinzufügen zu einem Cloud-Projekt in Visual Studio erstellt wird, besteht darin, eine Endlosschleife am Ende der Methode einzufügen. So könnte Ihr Code ähnlich aussehen wie diese:

public override void Run() 
{ 
    StartMyTimer(); 
    LoadDefaultSettings(); 

    while (true) 
    { 
     CheckToMakeSureSpawnedThreadsAreRunningOK(); 
     System.Threading.Thread.Sleep(10000); 
    } 
} 

Wie in den Kommentaren von Smarx erwähnt, wäre es auch möglich sein System.Threading.Thread.Sleep(Timeout.Infinite) anstelle der Schleife zu verwenden.

+1

Anstatt der Schleife, warum nicht Thread.Sleep (Timeout.Infinite)? – smarx

+0

Hauptsächlich weil ich nicht darüber nachgedacht habe. Die Endlosschleife, die in der Basisrolle liegt, wenn Sie eine hinzufügen. Zugegeben, es hat auch eine Trace-Nachricht, die alle X Sekunden ausgeschrieben wird, damit Sie wissen, dass die Rolle noch läuft.Als ich eine meiner ersten Worker-Rollen baute, habe ich mir auch die Schleife angesehen und darüber nachgedacht "was für eine Zeitverschwendung" und sie gelöscht. Verursacht ein Problem wie das, was hier erlebt wird. – knightpfhor

10

Loop in Run() ist mindestens in der Emulator Version 1.6 oder höher nicht erforderlich. Allerdings habe ich heute dasselbe Problem. Ich verbrachte ein paar Stunden, um herauszufinden, was der Grund sein könnte und fand, dass mein Projekt Verweise auf Microsoft.Windows.Azure Assemblies Version 1.7 verwendet und der Emulator, den ich verwende, ist von der Oktober-Version (1.8). Web-Projekte funktionieren gut, aber Prozess-Worker-Rollen starten und stoppen sofort, wie Sie es beschreiben. OnStart, Run und OnStop werden nur nicht aufgerufen. Als ich meine Worker-Rolle auf 1.8-Assemblies referenzierte, begann es erneut zu arbeiten. Noch ein paar Stunden verschwendet, danke Microsoft ...

+0

Sie haben mich gerade ein paar Stunden der Untersuchung @Alexey gerettet. Vielen Dank! :) http://stackoverflow.com/questions/19253015/will-azure-find-my-roleentrepoint-implementation-class-i-thats-the-direct-clas/19253556#19253556 – rui

+0

Willkommen, es ist eine echte Kopfschmerzen mit Azure SDK-Versionen. –

+0

Ich beobachtete, dass lokal eine heruntergeladene Probe von MSDN ausgeführt wird. Die Microsoft.WindowsAzure.ServiceRuntime-Referenz war 2.5.0.0, während 2.7.0.0 verfügbar ist. Durch das Aktualisieren der Referenz wurde das Problem beseitigt. Ich würde das weiter beobachten, bevor die Fixpunkte in OnStart und Run nicht getroffen wurden. –