2010-12-01 12 views
8

Tengo un Azure WorkerRole que se está deteniendo (no se lanzan excepciones) sin motivo aparente. Se detiene en el mismo lugar cada vez, pero el código simplemente ejecuta un proceso que tarda unos 20 segundos en ejecutarse. ¿Alguien puede postular por qué está pasando esto? ¿Hay un tiempo de espera en el método OnStart() que no conozco?Azure WorkerRole que se detiene inmediatamente después de iniciar

He aquí un desglose de lo que está pasando en mi rol de trabajo:

OnStart() -> Diagnóstico Configurado

Run() ->

  1. se ajusta un temporizador (60) a desencadenar la carga de la aplicación
  2. Se inicia un nuevo hilo para cargar algunas configuraciones predeterminadas (toma ~ 30 segundos)

El código nunca llega a la carne de # 1.

Para el n. ° 1 anterior, lo probé con y sin temporizador (no hay diferencia). Para el n. ° 2 anterior, lo probé con y sin iniciar un nuevo hilo (no hay diferencia).

Aquí está la salida de depuración para mi papel trabajador:

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

¿Se puede publicar el código? – Igorek

+1

Descubrí por qué la aplicación se bloqueaba y ponía una solución, pero todavía no tiene sentido para mí la razón por la cual la función de trabajador se bloquee en primer lugar. La sección "config" de la aplicación que se desencadenó al inicio tenía un método que tardó una cantidad considerable de tiempo en ejecutarse. Moví esa sección del código "config" para que se ejecute bajo demanda (cargado de forma diferida). Eso pareció solucionar el problema. – Jason

+0

¿Cómo descubriste por qué se estaba cayendo? Parece que tengo el mismo problema, pero sin excepción es bastante difícil de depurar:/ –

Respuesta

7

Sin ver el código, suena como su método Run está saliendo. Si el método de ejecución alguna vez sale, la función se detendrá. La forma en que la función de trabajador predeterminada que se crea cuando se agrega a un proyecto en la nube en Visual Studio hace esto es colocar un bucle infinito al final del método. Así que su código puede tener un aspecto similar a este:

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

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

Como se ha mencionado por Smarx en los comentarios, también sería posible utilizar System.Threading.Thread.Sleep(Timeout.Infinite) en lugar del bucle.

+1

En lugar del bucle, ¿por qué no Thread.Sleep (Timeout.Infinite)? – smarx

+0

Principalmente porque no pensé en eso. El ciclo infinito ya que eso es lo que está en el rol básico cuando se agrega uno. De acuerdo, también tiene un mensaje de rastreo que se escribe cada X segundos para informarle que la función aún se está ejecutando.Cuando estaba construyendo uno de mis primeros roles de trabajador, también miraba el ciclo y pensaba "qué pérdida de tiempo" y lo borraba. Causando un problema como el que se está experimentando aquí. – knightpfhor

10

Loop in Run() no es necesario al menos en el emulador versión 1.6 o superior. Sin embargo, tengo el mismo problema hoy. Pasé unas horas para descubrir cuál era el motivo y descubrí que mi proyecto utiliza referencias a Microsoft.Windows.Azure assemblies versión 1.7 y el emulador que uso es de la versión de octubre (1.8). Los proyectos web funcionan bien, pero los roles de los trabajadores de proceso comienzan e inmediatamente se detienen como usted describe. OnStart, Run y ​​OnStop simplemente no son llamados. Cuando hice referencia a mi función de trabajador para 1.8 ensamblajes, comenzó a funcionar nuevamente. Otras pocas horas perdidas, gracias a Microsoft ...

+0

Me acabas de ahorrar un par de horas de investigación @Alexey. ¡Gracias! :) http://stackoverflow.com/questions/19253015/will-azure-find-my-roleentrypoint-implementation-class-if-thats-the-direct-clas/19253556#19253556 – rui

+0

Bienvenido, es un verdadero dolor de cabeza con las versiones de Azure SDK. –

+0

Observé esto ejecutando localmente una muestra descargada de MSDN. La referencia de Microsoft.WindowsAzure.ServiceRuntime era 2.5.0.0, mientras que 2.7.0.0 está disponible. La actualización de la referencia hizo que el problema desapareciera. Además, me gustaría observar que antes de los puntos de interrupción de la corrección en OnStart y Run no se golpearon. –

Cuestiones relacionadas