2010-12-01 14 views
8

Possiedo un Azure WorkerRole in fase di arresto (nessuna eccezione viene lanciata) senza alcun motivo apparente. Si ferma sempre nello stesso punto, ma il codice sta semplicemente eseguendo un processo che richiede circa 20 secondi per essere eseguito. Qualcuno può postulare sul perché questo sta accadendo? C'è un timeout nel metodo OnStart() di cui non sono a conoscenza?Azure WorkerRole che si arresta immediatamente dopo l'avvio

Ecco una ripartizione di ciò che sta accadendo nel mio ruolo di lavoratore:

OnStart() -> Diagnostica Configurato

Run() ->

  1. Un timer è impostato (60) a attivare la carne dell'applicazione
  2. Un nuovo thread viene avviato per caricare alcune impostazioni predefinite (dura circa 30 secondi)

Il codice non arriva mai alla carne di # 1.

Per il numero 1 in alto, l'ho provato con e senza timer (nessuna differenza). Per il # 2 sopra, l'ho provato con e senza iniziare un nuovo thread (nessuna differenza).

ecco l'output di debug per il mio ruolo dei lavoratori:

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

Puoi pubblicare il codice? – Igorek

+1

Ho scoperto il motivo per cui l'applicazione si è bloccata e ha inserito una correzione, ma non ha ancora senso per me sul perché il ruolo del lavoratore si bloccherebbe in primo luogo. La sezione "config" dell'app che è stata attivata all'avvio aveva un metodo che richiedeva molto tempo per essere eseguito. Ho spostato quella sezione del codice "config" per essere eseguita su richiesta (lazy loaded). Questo sembrava risolvere il problema. – Jason

+0

Come hai capito perché si stava bloccando? Sembra che abbia lo stesso problema, ma senza un'eccezione è piuttosto difficile eseguire il debug:/ –

risposta

7

Senza vedere il codice, suona come il vostro metodo Run sta uscendo. Se il metodo di esecuzione si interrompe, il ruolo si interrompe. Il modo in cui il ruolo di lavoro predefinito che viene creato quando si aggiunge a un progetto cloud in Visual Studio consiste nel mettere un ciclo infinito alla fine del metodo. Così il vostro codice potrebbe essere simile a questo:

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

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

Come citato da smarx nei commenti, ma sarebbe anche possibile usare System.Threading.Thread.Sleep(Timeout.Infinite) al posto del ciclo.

+1

Invece del ciclo, perché non Thread.Sleep (Timeout.Infinite)? – smarx

+0

Principalmente perché non ci ho pensato. Il ciclo infinito come quello che è nel ruolo fondamentale quando ne aggiungi uno. Garantito che ha anche un messaggio di traccia che viene scritto ogni X secondi per farti sapere che il ruolo è ancora in esecuzione.Quando stavo costruendo uno dei miei primi ruoli da lavoratore ho anche guardato il ciclo e ho pensato "che spreco di tempo" e l'ho cancellato. Causando un problema come quello che viene vissuto qui. – knightpfhor

10

Loop in Run() non è richiesto almeno nell'emulatore versione 1.6 o successiva. Comunque ho avuto lo stesso problema oggi. Ho trascorso alcune ore a scoprire quale fosse la ragione e ho scoperto che il mio progetto utilizza riferimenti a Microsoft.Windows.Azure assembly versione 1.7 e l'emulatore che utilizzo proviene dalla versione di ottobre (1.8). I progetti Web funzionano bene, ma i ruoli dei processi di processo iniziano e si fermano immediatamente come descritto. OnStart, Run e OnStop non vengono semplicemente chiamati. Quando ho fatto riferimento al mio ruolo di lavoratore a 1,8 assembly, ha iniziato a funzionare di nuovo. Ancora poche ore sprecate, grazie a Microsoft ...

+0

Mi hai appena salvato un paio d'ore di indagini @Alexey. Grazie! :) http://stackoverflow.com/questions/19253015/will-azure-find-my-roleentrypoint-implementation-class-if-thats-the-direct-clas/19253556#19253556 – rui

+0

Benvenuto, è un vero mal di testa con le versioni di Azure SDK. –

+0

Ho osservato questo in esecuzione localmente un esempio scaricato da MSDN. Il riferimento Microsoft.WindowsAzure.ServiceRuntime era 2.5.0.0 mentre 2.7.0.0 è disponibile. L'aggiornamento del riferimento ha risolto il problema. Osserverei ulteriormente ciò prima che i punti di interruzione delle correzioni in OnStart e Run non venissero colpiti. –

Problemi correlati